资源描述:
《语义分析与中间代码生成.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
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.pl
9、ace);(3)E→E-Temit(-,E.place,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#includeusingnamespa
10、cestd;inttable[10][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,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表示不具可比性
11、charstSymbol[100];//定义栈,用来存储终结符charstSemantic[100];//语义栈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)
28、{if(str=='+'
29、
30、str=='-'
31、
32、str=='*'
33、
34、str=='/'
35、
36、str=='^')return1;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'#':ret
37、urn8;}return0;}intCompare(chartop,charinput){inti=Index(top);intj=Index(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
38、="(+,";str+=stSemantic[i-1];str+=",";str+=stSemantic[i+1];str+=",";str+=s2;str+=")";returnstr;case'-':s1='E';s2=(char)count++;s3="3