上海电力学院编译原理课程实验报告实验名称:实验三自下而上语法分析及语义分析院系:计算机科学与技术学院专业年级:学生姓名:学号:指导老师:实验日期:实验三自上而下的语法分析一、实验目的:通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。二、实验学时:4学时。三、实验内容根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。对于正确的表达式,给出表达式的值。对于错误的表达式,给出出错位置。四、实验方法采用LR分析法。首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表)。接下来给出LR分析表。然后程序的具体实现:LR分析表可用二维数组(或其他)实现。添加一个val栈作为语义分析实现的工具。编写总控程序,实现语法分析和语义分析的过程。注:对于整数的识别可以借助实验1。五、文法定义简单的表达式文法如下:(1)E-E+T(2)E-E-T(3)E-T(4)T-T*F(5)T-T/F(6)T-F(7)F-(E)(8)F-i状态ACTION(动作)GOTO(转换)i+-*/()#ETF0S5S41231S6S12acc2R3R3S7S13R3R33R6R6R6R6R6R64S5S48235R8R8R8R8R8R86S5S4937S5S4108S6R12S119R1R1S7S13R1R110R4R4R4R4R4R411R7R7R7R7R7R712S5S414313S5S41514R2R2S7S13R2R215R5R5R5R5R5R5五、处理程序例和处理结果例示例1:*(+3191)+3191#六、源代码【】_str());(newstat);;if==30)//整数,压入其值(atoielse//其他单词,压入0占位(0);//输出word=get_w();coutactendl;}//规约动作elseif(act[0]=='R'){coutact'\t';stringsn=(1);//产生式编号//根据规约使用的产生式更新各个栈if(sn==1)//E-E+T{();();();();();();(E);intright_digit=();();intleft_digit=();intnew_value=left_digit+right_digit;(new_value);}elseif(sn==2)//E-E-T{();();();();();();(E);intright_digit=();();intleft_digit=();intnew_value=left_digit-right_digit;(new_value);}elseif(sn==4)//T-T*F{();();();();();();(T);intright_digit=();();intleft_digit=();intnew_value=left_digit*right_digit;(new_value);}elseif(sn==5)//T-T/F{();();();();();();(T);intright_digit=();();intleft_digit=();intnew_value=left_digit/right_digit;(new_value);}elseif(sn==3)//E-T{();();(E);}elseif(sn==6)//T-F{();();(T);}elseif(sn==7)//F-(E){();();();();();();(F);();intdigit_val=();();(digit_val);}elseif(sn==8)//F-i{();();(F);}else{cout分析程序出错!endl;return;}//实施go表中的动作intnext_status=(),());(next_status);//输出coutnext_statusendl;}else{cout分析程序出错。;return;}}}intmain(){charch;do{system(cls);process();coutendlendl继续新的语法分析按y,其它字符退出:;();();cinch;}while(ch=='y');return0;}