1、第 1 页 共 7 页实验内容:可选择 LL1 分析法、算符优先分析法、LR 分析法之一,实现如下表达式文法的语法制导翻译过程。文法 GE如下所示:EE+T | E-T | TTT*F | T/F | FFPF | PP(E) | i要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。实验目的:1掌握语法制导翻译的基本功能。2巩固对语义分析的基本功能和原理的认识。3能够基于语法制导翻译的知识进行语义分析。4掌握类高级语言中基本语句所对应的语义动作。5理解并处理语义分析中的异常和错误。实验要求:1在实验二
2、的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2要求详细描述所选分析方法进行制导翻译的设计过程;3完成对所设计分析器的功能测试,并给出测试数据和实验结果;4为增加程序可读性,请在程序中进行适当注释说明;5整理上机步骤,总结经验和体会;6认真完成并按时提交实验报告。开始词法分析中间代码语法、语义分析出错处理语法、语义分析中间代码生成结束实验步骤:-1 语义子程序为:(会生成四元式的部分 :)(1) Pi (2) E E+T emit(+,E.place,T.place,E.place);(3) E E-T emit(-,E.place,T.place,E.place);(4) T T
3、*F emit(*,T.place,F.place,T.place);(5) T T/F emit(/,T.place,F.place,T.place);(6) FPF emit(,P.place,F.place,F.place);(7) P(E) -2 源代码:第 2 页 共 7 页#include#include #include #includeusing namespace std;int table1010 = 1, 1, -1, -1, -1, -1, -1, 1, 1 , 1, 1, -1, -1, -1, -1, -1, 1, 1 , 1, 1, 1, 1, -1, -1, -
4、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表示不具可比性char stSymbol100;/ 定义栈,用来存储终结符char stSemantic100;/语义栈int top = -1 ;/栈顶指针
5、int i = 0;static int count = 75;/新建的符号的小标/ 判断是否为终结符int IsVT(char str) if (str=+ | str=- | str=* | str=/ | str= | str=( | str=i | str=) | str=# )return 1;return 0;/ 操作符判断int IsOpe(char str) if (str=+ | str=- | str=* | str=/ | str=)return 1;return 0;/ 有字符判断该字符在 table 数组中的位置int Index(char str) switch (
6、str) case +:return 0;case -:return 1;case *:return 2;case /:第 3 页 共 7 页return 3;case :return 4;case i:return 5;case (:return 6;case ):return 7;case #:return 8;return 0;int Compare(char top, char input) int i = Index(top);int j = Index(input);return tableij;/动作分析string Action(char vt,char switch(vt)c
7、ase i:s1 = F;s2 = stSemantici;s3 = “1“;return “;case +:s1 = E;s2 = (char)count+;s3 = “2“;str = “(+,“;str += stSemantici-1;str += “,“;str += stSemantici+1;str += “,“;str += s2;str += “)“;return str;case -:s1 = E;s2 = (char)count+;s3 = “3“;str = “(-,“;第 4 页 共 7 页str += stSemantici-1;str += “,“;str +=
8、stSemantici+1;str += “,“;str += s2;str += “)“;return str;case *:s1 = T;s3 = “4“;s2 = count+;str = “(*,“;str += stSemantici-1;str += “,“;str += stSemantici+1;str += “,“;str += s2;str += “)“;return str;case /:s1 = T;s2 = (char)count+;s3 = “5“;str = “(/,“;str += stSemantici-1;str += “,“;str += stSemant
9、ici+1;str += “,“;str += s2;str += “)“;return str;case :s1 = F;s2 = (char)count+;s3 = “6“;str = “(,“;str += stSemantici-1;str += “,“;str += stSemantici+1;str += “,“;str += s2;str += “)“;return str;case ):s1 = stSymboltop-1;第 5 页 共 7 页s2 = stSemantici-1;s3 = “7“;return “;case #:return “;return “;void Fenxi(char* input)cout 0);void main()/初始化栈stSymbol+top = #;stSemantictop = _;char input30;coutinput;Fenxi(input);第 7 页 共 7 页-4 结果截图:实验总结通过实验实现语法制导翻译功能,得到四元式,初步掌握分析器的功能测试【实验过程记录(源程序、测试用例、测试结果及心得体会等) 】