您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > WHILE循环语句的翻译程序设计课设报告
武汉理工大学《编译原理》课程设计1.题目:将WHILE语句转换成四元式的程序实现设计内容及要求:设计一个语法制导翻译器,将WHILE语句翻译成四元式。要求:先确定一个定义WHILE语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的WHILE语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。1、系统描述通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。用语法制导完成语义分析,并将形成的中间代码以四元式的形式输出。2、文法及属性文法的描述2.1文法的描述该文法的产生式如下所示:(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表示合法标识符。2.2属性文法的描述对该文法的属性文法描述如下:(1)S-while(B){E}prinf(ifBgotoEelsegotonext)(2)E-AEprint(E.val=A.val·E.val)(3)E-Aprint(E.val=A.val)(4)A-iPAprint(A=i.ValPA.Val)(5)A-i;A.Val=i;(6)B-iTiprint(B=i1.ValTi2.Val)武汉理工大学《编译原理》课程设计(7)B-iB.Val=i3、语法分析方法描述及语法分析表设计3.1语法分析表设计3.1.1文法的DFA武汉理工大学《编译原理》课程设计3.1.2LR(0)分析表状while(){}ioprop;#SEBAI3:S-W(·B){E}B-·iTiB-·iI4:S-W(B·){E}I6:S-W(B)·{E}I5:B-i·TiB-i·I7:B-iT·iI9:S-W(B){·E}E-·AEE-·AA-·iPAA-·i;I10:E-A·EE-A·E-·AEE-·AA-·iPAA-·i;I11:S-W(B){E·}I12:S-W(B){E}·I13:E-AE·I14:A-i·PAA-i·;I15:A-iP·AA-·iPAA-·i;I16:A-iPA·I17:A-i;·SW(Bi){E}AiPi;EAiATiI8:B-iTi·I2:S-W·(B){E}I0:S’-·SS-·W(B){E}武汉理工大学《编译原理》课程设计态0S211Z2S33S544S65r7S76S97S88r69S14111010r3S14131011S1212r113r214S15S1715S141616r4r417r5r53.1.2LR(0)分析方法描述说明LR分析法的规约过程是规范推到的逆过程,所以LR分析过程是一种规范规约的过程。其分析过程为:由文法构造出该文法项目集,再根据项目集构造该文法的DFA,再判断是否有移进-规约和规约-规约冲突,若没有冲突则该文法为LR(0)的,若有冲突则该文法是SLR(1)的,最后可以构造出LR(0)分析表。然后根据LR(0)分析表进行语法分析,分析过程就是进栈和规约的过程。若能规约出开始符S,则语法正确。反之,语法错误。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)四元式对中间结果的引用必须通过给定的名字,也就是说,四元式的联系是通过临时变量实现的。将while(BropC)gotoL写成(jrop,B,C,L)本程序中所用到的四元式语句如下:1)形如(op,arg1,arg2,result)的赋值语句2)形如(jrop,B,C,L)的条件转移语句3)形如(=,arg1,-,result)的复写语句5、编译系统的概要设计5.1词法分析词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。词法分析检查的错误主要是挑出源程序中出现的非法符号。所谓非法符号是指不是程序设计语言中允许出现的符号,就像自然语句中的错字。流程图如下:5.2语法分析语法分析是编译过程的核心部分。它的任务是在词法分析识别出单词符号串的基结束符“#”界限符开始到输入流中读下一字符CharChar是什么?初始化标识符和关键字词法分析子程序字母数字运算符无符号数词法分析子程序运算符词法分析子程序界限符词法分析子程序武汉理工大学《编译原理》课程设计础上,分析并判定程序的语法结构是否符合语法规则。流程图如下:其中SP为栈顶指针,S[i]为状态栈,X[i]为文法符号栈。状态转换表内容按关系GOTO[Si,X]=Sj确定,改关系式是指当前栈顶状态为Si遇到当前文法符号为X时应转向状态Sj。X为终结符或非终结符。ACTION[Si,a]规定了栈顶状态为Sj时遇到输入符号c[i]应该执行的动作。动作有以下四种可能:(1)移进:当Sj=GOTO[Si,a]成立,则把Sj移入到文法符号栈。其中i,j表示状态号。(2)规约:当在栈顶形成句柄为b时,则用b归约为相应的非终结符A,即当文法中有A-b的产生式,而b的长度为r,则从状态栈和文法符号栈中自栈顶向下去掉r个符号。并把A移入文法符号栈内,再把满足Sj=GOTO[Si,A]的状态移进状态栈,其中Si为修改指针后的栈顶状态。(3)接受acc:当归约到文法符号栈中只剩下文法的开始符号S时,并且输入符号串已结束即当前输入符是‘#’,则为分析成功。(4)报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该分发能接受的句子。5.3语法制导翻译在语法分析过程中,随着分析的步步进展,根据每个产生式所对应的语义子程序输入串#…ci…c1Sp→##┋┋┋┋X[i]S[i]总控程序输出ACTION表GOTO表栈结束武汉理工大学《编译原理》课程设计(或语义规则描述的语义动作)进行翻译。属性文法的每个符号有属性,所以每个符号入栈时,必须连属性一起入栈,这样,栈符号就由文法符号及存放该符号属性的域所组成。由于属性类型不同,属性域存放的内容就要根据属性的类型来定。有的可能直接存放属性值,也有的存放的是指向属性值的指针。对于综合属性,其属性域不存放其属性值,而是存放一个指针,指向存贮该属性值的单元。对于继承属性,其属性域直接保存其属性值。继承属性的属性域刚入栈时为空,但是在该栈符号变成栈顶符号之前的某一时刻,它们必须接受相应的属性值,即在成为栈顶时,继承属性的属性域必须有值。6、详细的算法描述Main()//主程序算法{open(save.txt);//打开输入文件open(output.txt);//打开输出文件Print(G[S]);//显示文法G[S]intcheck,over=0;intm,k;charchr;for(m=0;mMAX;m++)for(k=0;kbuf;k++)t[m].name[k]='\0';//初始化t[]initlab();//初始化LR(0)分析表get(sym);//取一个字符while(sym!=结束){chr=Getsymbol();//词法分析if(chr为空格)continue;else{武汉理工大学《编译原理》课程设计S[num]=chr;//保存词法分析结果num++;}}S[num++]='#';print(Thewhilesentenceis:);LR();//语法分析if(over==-1||Check!=1){print(Yourinputdoesnottallywiththegrammar!);close(文件);return-1;}if(Check==1){print(Parsingcompleted!);close(文件);return-1;}close(文件);return0;}LR()//语法分析算法{i=0;intk=0;status.push(0);symbol.push('#');武汉理工大学《编译原理》课程设计a=输入串队列队首元素;b=结束符号;c=符号栈栈顶元素;d=状态栈栈顶元素;s=开始符号;while(a!=b&&c!=s){if(k==0){k=meet(d,a);continue;}if(k==1){k=meet(d,c);continue;}if(k==-1){出错break;}if(k==2){成功break;}}k=0;武汉理工大学《编译原理》课程设计while(a==b)//分析结束{if(c==s){if(meet(d,a)==2){ONE();//语法正确,输出四元式成功break;}}if(c!=s&&(meet(d,c)==1||meet(d,c))==0)continue;elseif(meet(d,c)==-1){出错break;}}}meet(intc,chars)//进栈规约算法{if(s==错误)return-1;intm,k=0;if(规约标志为1){规约武汉理工大学《编译原理》课程设计return1;//规约成功}else进栈}charGetsymbol()//词法分析算法{i=0;while(sym!=结束){if(sym==合法标识符的开头){inth1=0,h2=0,h3=0;while(sym==字母/数字/下划线){保存sym到token[]中;get(sym);//取下一字符}判断token[]中的字符串是否为关键字while/rop/opif(是while)return'w';//返回while给主程序elseif(是rop)return'r';//返回rop给主程序elseif(是op)return'o';//返回op给主程序elsereturn'i';}//已经取了下一个字符武汉理工大学《编译原理》课程设计elseif(sym==数字){while(sym==数字){保存sym到token[]中;get(sym);//取下一字符}return'i';//数字}elseif(sym=='('){保存sym到token[]中;get(sym);//取下一字符return'(';}elseif(sym==')'){保存sym到token[]中;get(sym);//取下一字符return')';}elseif(sym=='='){保存sym到token[]中;get(sym);武汉理工大学《编译原理》课程设计return'=';}elseif(sym==''){get(sym);return'';}else{get(sym);return'X';//错误}}return0;}7软件的测试方法和测试结果7.1运行正确时的情况如下:武汉理工大学《编译原理》课程设计武汉理工大学《编译原理》课程设计7.2词法分析的结果保存在cifa.txt中:7.3语法分析的过程保存在yufa.txt中:武汉理工大学《编译原理》课程设计7.4四元式形式的中间代码输出在obj.txt中:7.5当文法分析出错时的情况如下:当语法分析进行到第5步时由于在分析表中找不到相应的下一个状态,故会出错!8研制报告通过本次的编译原理的课程设计,我进一步认识了LR分析方法,对于大多数用无二义性的上下文无关文法描述的语言都可以用相应的LR分析器进行识别,而且这种方法还具有分析速度快,能准确、即使地指出出错的位置。但是
本文标题:WHILE循环语句的翻译程序设计课设报告
链接地址:https://www.777doc.com/doc-6252491 .html