编译原理课程设计--IF-ELSE条件语句的翻译程序设计
- 格式:doc
- 大小:167.00 KB
- 文档页数:15
课程设计任务书学生姓名:_____ 专业班级:指导教师:_ 工作单位:计算机科学与技术学院题目: IF-ELSE条件语句的翻译程序设计(简单优先法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。
时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2012年 10月 23日系主任(或责任教师)签名: 2012年 10月 23日IF-ELSE条件语句的翻译程序设计(简单优先法、输出四元式)1系统描述1.1实验目的对条件语句:IF <布尔表达式> THEN <赋值语句> ELSE <赋值语句>(1)按给定的题目写出符合语法分析方法要求的文法和属性文法描述。
(2)按给定的题目给出语法分析方法的思想及分析表的设计。
(3)按给定题目给出中间代码序列的结构设计。
(4)完成相应的词法分析、语法分析和语义分析程序设计。
(5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
1.2开发平台Visual C++ 6.0、Windows XP2文法及属性文法的描述2.1文法描述(1) S->if E then B else B(2) E->(A>A)(3) E->(A<A)(4) E->(A)(5) A->d(6) A->num(7) B->{d=C}(8) C->A+A(9) C->A-A(10) C->A*A(11) C->A/A(12) C->A其中,d代表变量,num代表常量(这里仅限数字),E布尔表达式,B为赋值表达式,C为算术表达式2.2属性文法描述(1)E->A rop A’{E.true=nextstat;E.codebegin=nextstat;E.false=nextstat+1;emit(“if” A.place “rop” A’.place “goto” -);emit(“goto” -)}(2)E->(A) {E.place=A.place}(3)A->id {p=lookup();if p!=null thenA.place=pelse error}(4)B->{d=C} {d.place=C.place}(5)C->A op A’{C.place=newtemp;emit(C.place “=” A.place “op” A’.place)} (6)C->A {C.place=A.place}注:rop为>或<;op为+、-、*或/3语义分析方法的描述及分析表设计3.1优先关系定义X=Y 表示X和Y的优先关系相等X>Y 表示X的优先性比Y的优先性大X<Y 表示X的优先性比Y的优先性小(1)X=Y 当且仅当G中存在产生式规则A->…XY…(2)X>Y 当且仅当G中存在产生式规则A->…XB…,B=>Y…,B≠Y(3)X<Y 当且仅当G中存在产生式规则A->…BD…,B=>…X,B≠X,D=>Y…3.2简单优先文法定义若一个文法是简单优先文法必须满足以下条件:(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立(2)在文法中任意两个产生式没有相同的右部其中第一条是必须满足的,第二条若不满足则会导致规约不唯一。
3.3简单优先文法的算法步骤首先根据已知优先文法构造相应优先关系矩阵,并将文法的产生式保存,设置符号栈S,算法步骤如下:(1)将输入符号串a1,a2…aN#依次逐个存入符号栈S中,直到遇到栈顶符号ai 的优先性>下一个带输入符号aj时为止。
(2)栈顶当前符号ai为句柄尾,由此向左在栈中找句柄的头符号ak,即找到ak-1<ak为止。
(3)由句柄ak…ai在文法产生式中查找右部为ak…ai的产生式,若找到则用相应左部代替句柄,若找不到则为出错,这是可以判定输入串不是该文法的句子。
(4)重复上述(1)(2)(3)步骤直到规约完输入符号串,栈中只剩下文法的开始符号为止。
3.4语义分析方法描述语义分析采用基于属性文法的翻译方案,即,在语法分析过程中每进行一次规约操作则对对应产生式进行语义计算。
3.5分析表构造3.5.1优先关系的计算3.5.1.1 定义集合FA(S)={a|S=>a…,S≠a,a为文法符号}LA(S)={a|S=>…a,S≠a,a为文法符号}3.5.1.2 改造后的优先关系计算当文法中存在A->…XY…时,X=Y当文法中存在A->…XB…时,X<FA(B)当文法中存在A->…BD…时,LA(B)>D且LA(B)>FA(D)3.5.2分析表结构分析表采用二维数组存储方式,文法中的每一个符号对应数组a中的一个位置,而a[i][j]代表第i个和第j个的优先关系:(1)a[i][i]=0 无优先关系(2)a[i][i]=1 i对应元素优先级小于j的(3)a[i][i]=2 i对应元素优先级大于j的(4)a[i][i]=3 i对应元素优先级等于j的而在分析过程中规约产生式的选择则在语法分析过程中,在语法分析过程中实现。
分析表最终结果如下:int anltable[22][22]={/*S*/{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},/*if*/ {0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*E*/{0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*then*/{0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},/*B*/{0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},/*else*/{0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},/*(*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},/*)*/{0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},/*>*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},/*<*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},/*=*/{0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,0,0,0,0,0,0,0},/*A*/{0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,2,3,3,3,3,0},/*d*/{0,0,0,0,0,0,0,2,2,2,3,0,0,0,0,0,2,2,2,2,2,0},/*num*/{0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0},/*C*/{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0},/*{*/{0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0},/*}*/{0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},/*+*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},/*_*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},/***/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},/*/*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},/*#*/{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},};//0-error ,1=<, 2=> ,3==4中间代码形式描述及结构设计四元式是一种比较普遍采用的中间代码形式。
四元式的四个组成成分是:算符op,第一和第二运算对象ARG1和ARG2及运算结果RESULT。
运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。
例如:a=b*c+b*d的四元式表示如下:(1)(*,b,c,t1)(2)(*,b,d,t2)(3)(+,t1,t2,t3)(4)(=,t3,-,a)四元式和三元式的主要不同在于,四元式对中间结果的引用必须通过给定的名字,而三元式是通过产生中间结果的三元式编号。
也就是说,四元式之间的联系是通过临时变量实现的。
5编译系统的概要设计(1)系统主要分为两个模块:词法分析和语法分析(包括语义分析)。
并且在分析过程中将词法分析产生的单词输出到文件,语法分析过程中分析栈的变化情况输出到文件。
(2)系统设计采用过程化的设计方法,将词法分析、语法分析等功能模块在独立的过程中实现。
(3)系统概要结构如下:1)预定义模块2)词法分析模块3)语法分析模块4)其他辅助模块5)主程序模块(主要指程序入口函数main())各模块调用关系如下:6算法描述6.1预定义模块预定义模块主要包括宏定义、常量定义、类型定义以及全局变量定义等。
具体如下:(1)宏定义#define OK 1//正常#define ERROR -1//出错#define FAILURE -1//分析失败(2)类型定义struct att{//名字表类型string sname;char select;char addre;};typedef struct SqStack{char*base;char*top;int stacksize;}SqStack;//栈定义(3)全局变量int lineno = 1;//输出时的当前行号char ch ; //当前字符char allname[30][30];//单词全名char out[30][30];//保存单词简称att attname[40];//名字表(4)优先关系表初始化(见3.5.2)6.2词法分析词法分析主要为analysis(ifstream &fin,ofstream &fout)函数,其中fin为输入文件流,fout为单词输出文件流。