1、武汉理工大学编译原理课程设计1 题目:将 WHILE 语句转换成四元式的程序实现设计内容及要求:设计一个语法制导翻译器,将 WHILE 语句翻译成四元式。要求:先确定一个定义 WHILE 语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的 WHILE 语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。1、系统描述通过设计、编制、调试一个 WHILE 循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。用语法制导完成语义分析,并将形成的
2、中间代码以四元式的形式输出。2 、文法及属性文法的描述21 文法的描述该文法的产生式如下所示:(1)S-while(B)E(2)E-AE(3)E-A(4)A-iPA (5)A-i(6)B-iTi(7)B-i其中 while、( 、) 、 、 、P、T 、 ; 和 i 均为终结符,而 S、A 、B、E 这些大写字母均为非终结符。T 表示比较运算符,P 表示算术运算符,i 表示合法标识符。22 属性文法的描述对该文法的属性文法描述如下:(1) S-while(B)E prinf(if B goto E else goto next)(2) E-AE print(E.val = A.valE.val
3、)(3) E-A print(E.val = A.val)武汉理工大学编译原理课程设计(4) A-i P A print(A= i.Val P A.Val) (5) A-i; A.Val = i;(6) B-i T i print(B = i1.Val T i2.Val)(7) B-i B.Val = i3 、语法分析方法描述及语法分析表设计31 语法分析表设计311 文法的 DFA武汉理工大学编译原理课程设计I3: S-W (B)EB-iTiB-iI4: S-W (B)EI6: S-W (B)EI5: B-iTiB-iI7: B-iTiI9: S-W (B) EE-AEE-AA-iPAA-i
4、 ;I10: E-AEE-AE-AEE-AA-iPAA-i ;I11: S-W (B)EI12: S-W (B)EI13: E-AEI14: A-iPAA-i ;I15: A-iPAA-iPAA-i ; I16: A-iPAI17: A-i ;SW(Bi)EAiP i;EAiATiI8: B-iTiI2: S-W (B)E312 LR(0)分析表状 while ( ) i op rop ; # S E B AI0: S-SS-W (B)E武汉理工大学编译原理课程设计态0 S2 11 Z2 S33 S5 44 S65 r7 S76 S97 S88 r69 S14 11 1010 r3 S14 1
5、3 1011 S1212 r113 r214 S15 S1715 S14 1616 r4 r417 r5 r5312 LR(0)分析方法描述说明LR 分析法的规约过程是规范推到的逆过程,所以 LR 分析过程是一种规范规约的过程。其分析过程为:由文法构造出该文法项目集,再根据项目集构造该文法的 DFA,再判断是否有移进-规约和规约-规约冲突,若没有冲突则该文法为 LR(0)的,若有冲突则该文法是 SLR(1)的,最后可以构造出 LR(0)分析表。然后根据 LR(0)分析表进行语法分析,分析过程就是进栈和规约的过程。若能规约出开始符 S,则语法正确。反之,语法错误。4 、中间代码形式的描述及中间代
6、码序列的结构设计本系统中所采用的中间代码形式是四元式,是一种比较普遍采用的形式。四元式的四个组成成分是:算符 op,第一和第二运算对象 ARG1 和 ARG2 及运算结果RESULT。运算对象和运算结果有时指用户自己定义的变量,有时指编译程序引进的临时变量。例如 a:=b*c+b*d 的四元式表示如下:1) (*,b,c,t1)武汉理工大学编译原理课程设计2) (*,b,d,t2)3) (+,t1,t2,t3)4) (:=,t3,-,a)四元式对中间结果的引用必须通过给定的名字,也就是说,四元式的联系是通过临时变量实现的。将 while( B rop C )goto L 写成(jrop,B,C
7、,L)本程序中所用到的四元式语句如下:1)形如(op,arg1,arg2,result)的赋值语句2)形如(jrop,B,C,L)的条件转移语句3)形如(=,arg1,-,result)的复写语句5、编译系统的概要设计5.1 词法分析词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。词法分析检查的错误主要是挑出源程序中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中的错字。流程图如下:结束符“#”界限符开始到输入流中读下一字符CharChar 是什么?初始化标识符和关键字词法分
8、析子程序字母数字运算符无符号数词法分析子程序运算符词法分析子程序界限符词法分析子程序武汉理工大学编译原理课程设计5.2 语法分析语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。流程图如下:其中 SP 为栈顶指针,Si为状态栈,Xi为文法符号栈。状态转换表内容按关系GOTOSi,X=Sj 确定,改关系式是指当前栈顶状态为 Si 遇到当前文法符号为 X 时应转向状态 Sj。X 为终结符或非终结符。ACTIONSi,a规定了栈顶状态为 Sj 时遇到输入符号 ci应该执行的动作。动作有以下四种可能:(1) 移进:当 Sj=GOTOS
9、i,a成立,则把 Sj 移入到文法符号栈。其中 i,j 表示状态号。(2) 规约:当在栈顶形成句柄为 b 时,则用 b 归约为相应的非终结符 A,即当文法中有A-b 的产生式,而 b 的长度为 r,则从状态栈和文法符号栈中自栈顶向下去掉 r个符号。并把 A 移入文法符号栈内,再把满足 Sj=GOTOSi,A的状态移进状态栈,其中 Si 为修改指针后的栈顶状态。(3) 接受 acc:当归约到文法符号栈中只剩下文法的开始符号 S 时,并且输入符号串已结束即当前输入符是# ,则为分析成功。(4) 报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该分发能接受的句子。输入
10、串#cic1Sp#XiSi 总 控 程 序 输出ACTION表 GOTO表栈结束武汉理工大学编译原理课程设计5.3 语法制导翻译在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序(或语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属
11、性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。6 、详细的算法描述Main() /主程序算法open(“save.txt“); /打开输入文件open(“output.txt“); /打开输出文件Print(GS); /显示文法 GSint check,over=0;int m,k;char chr;for(m=0;m”和“中的 isalnum() 函数(如果参数是字母数字,即字母或数字,该函数返回 true)的运用可以减少我们自定义一些基本函数的麻烦。conio.h头文件 ,conio 是 Console Input/Output(控制台输入输出)的简写,其中定义了通过武汉理工大学编译原理课程设计控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如 getch()函数等等。iomanip.h 是 I/O 流控制头文件,用于格式化的输出。还熟悉了关于 Stack 类的函数的运用,剩去了我们自己定义 stack 函数的麻烦,只需在头文件中加入#include即可。总结下来,此次课程设计使我获益匪浅,在实践中点点滴滴的提升了自己的逻辑分析和编程以及调试程序的能力。