资源描述:
《天津理工大学实验报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验内容:可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法G[E]如下所示:E→E+T
2、E-T
3、TT→T*F
4、T/F
5、FF→P^F
6、PP→(E)
7、i要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:1.掌握语法制导翻译的基本功能。2.巩固对语义分析的基本功能和原理的认识。3.能够基于语法制导翻译的知识进行语义分析。4.掌握类高级语言中基本语句所对应的语义动作。5.理解并处理语义分析中的异常和错误。实验要求
8、:1.在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2.要求详细描述所选分析方法进行制导翻译的设计过程;3.完成对所设计分析器的功能测试,并给出测试数据和实验结果;4.为增加程序可读性,请在程序中进行适当注释说明;5.整理上机步骤,总结经验和体会;6.认真完成并按时提交实验报告。开始词法分析中间代码语法、语义分析出错处理语法、语义分析中间代码生成结束实验步骤:---1语义子程序为:(会生成四元式的部分:)(1)P→i(2)E→E+Temit(+,E.place,T.place,E.place);(3)E→E-Temit(-,E.pl
9、ace,T.place,E.place);(4)T→T*Femit(*,T.place,F.place,T.place);(5)T→T/Femit(/,T.place,F.place,T.place);(6)F→P^Femit(^,P.place,F.place,F.place);(7)P→(E)---2源代码:第7页共7页#include#include#include#includeusingnamespacestd;inttable[10][10]={{1,1,-1,-1,-
10、1,-1,-1,1,1},{1,1,-1,-1,-1,-1,-1,1,1},{1,1,1,1,-1,-1,-1,1,1},{1,1,1,1,-1,-1,-1,1,1},{1,1,1,1,-1,-1,-1,1,1},{1,1,1,1,1,2,2,1,1},{-1,-1,-1,-1,-1,-1,-1,0,1},{1,1,1,1,1,2,2,1,1},{-1,-1,-1,-1,-1,-1,-1,2,0}};//1表示优先,-1表示落后,0表示同等,2表示不具可比性charstSymbol[100];//定义栈,用来存储终结符charstSemantic[10
11、0];//语义栈inttop=-1;//栈顶指针inti=0;staticintcount=75;//新建的符号的小标//判断是否为终结符intIsVT(charstr){if(str=='+'
12、
13、str=='-'
14、
15、str=='*'
16、
17、str=='/'
18、
19、str=='^'
20、
21、str=='('
22、
23、str=='i'
24、
25、str==')'
26、
27、str=='#')return1;return0;}//操作符判断intIsOpe(charstr){if(str=='+'
28、
29、str=='-'
30、
31、str=='*'
32、
33、str=='/'
34、
35、str=='^')return1
36、;return0;}//有字符判断该字符在table数组中的位置intIndex(charstr){switch(str){case'+':return0;case'-':return1;case'*':return2;case'/':第7页共7页return3;case'^':return4;case'i':return5;case'(':return6;case')':return7;case'#':return8;}return0;}intCompare(chartop,charinput){inti=Index(top);intj=Index(
37、input);returntable[i][j];}//动作分析stringAction(charvt,char&s1,char&s2,inti,string&s3){stringstr;switch(vt){case'i':s1='F';s2=stSemantic[i];s3="1";return"";case'+':s1='E';s2=(char)count++;s3="2";str="(+,";str+=stSemantic[i-1];str+=",";str+=stSemantic[i+1];str+=",";str+=s2;str+=")";
38、returnstr;case'-':s1='E';s2=(char)count++;s3="3