上海电力学院编译原理课程实验报告实验名称:实验三自下而上语法分析及语义分析院系:计算机科学与技术学院专业年级:学生姓名:学号:指导老师:实验日期:实验三自上而下的语法分析一、实验目的:通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。二、实验学时:4学时。三、实验内容根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。对于正确的表达式,给出表达式的值。对于错误的表达式,给出出错位置。四、实验方法采用LR分析法。首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。接下来给出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:20133191*(20133191+3191)+3191#六、源代码【cifa.h】//cifa.h#includestringusingnamespacestd;//单词结构定义structWordType{intcode;stringpro;};//函数声明WordTypeget_w();voidgetch();voidgetBC();boolisLetter();boolisDigit();voidretract();intReserve(stringstr);stringconcat(stringstr);【Table.action.h】//table_action.hclassTable_action{introw_num,line_num;intlineName[8];stringtableData[16][8];public:Table_action(){row_num=16;line_num=8;lineName[0]=30;lineName[1]=7;lineName[2]=13;lineName[3]=8;lineName[4]=14;lineName[5]=1;lineName[6]=2;lineName[7]=15;lineName[8]=0;for(intm=0;mrow_num;m++)for(intn=0;nline_num;n++)tableData[m][n]=;tableData[0][0]=S5;tableData[0][5]=S4;tableData[1][1]=S6;tableData[1][2]=S12;tableData[1][7]=acc;tableData[2][1]=R3;tableData[2][2]=R3;tableData[2][3]=S7;tableData[2][4]=S13;tableData[2][6]=R3;tableData[2][7]=R3;tableData[3][1]=R6;tableData[3][2]=R6;tableData[3][3]=R6;tableData[3][4]=R6;tableData[3][6]=R6;tableData[3][7]=R6;tableData[4][0]=S5;tableData[4][5]=S4;tableData[5][1]=R8;tableData[5][2]=R8;tableData[5][3]=R8;tableData[5][4]=R8;tableData[5][6]=R8;tableData[5][7]=R8;tableData[6][0]=S5;tableData[6][5]=S4;tableData[7][0]=S5;tableData[7][5]=S4;tableData[8][1]=S6;tableData[8][2]=S12;tableData[8][6]=S11;tableData[9][1]=R1;tableData[9][2]=R1;tableData[9][3]=S7;tableData[9][4]=S13;tableData[9][6]=R1;tableData[9][7]=R1;tableData[10][1]=R4;tableData[10][2]=R4;tableData[10][3]=R4;tableData[10][4]=R4;tableData[10][6]=R4;tableData[10][7]=R4;tableData[11][1]=R7;tableData[11][2]=R7;tableData[11][3]=R7;tableData[11][4]=R7;tableData[11][6]=R7;tableData[11][7]=R7;tableData[12][0]=S5;tableData[12][5]=S4;tableData[13][0]=S5;tableData[13][5]=S4;tableData[14][1]=R2;tableData[14][2]=R2;tableData[14][3]=S7;tableData[14][4]=S13;tableData[14][6]=R2;tableData[14][7]=R2;tableData[15][1]=R5;tableData[15][2]=R5;tableData[15][3]=R5;tableData[15][4]=R5;tableData[15][5]=R5;tableData[15][6]=R5;tableData[15][7]=R5;}stringgetCell(introwN,intlineN){introw=rowN;intline=getLineNumber(lineN);if(row=0&&rowrow_num&&line=0&&line=line_num)returntableData[row][line];elsereturn;}intgetLineNumber(intlineN){for(inti=0;iline_num;i++)if(lineName[i]==lineN)returni;return-1;}};【Table_go.h】//table_go.hclassTable_go{introw_num,line_num;//行数、列数stringlineName[3];inttableData[16][3];public:Table_go(){row_num=16;line_num=3;lineName[0]=E;lineName[1]=T;lineName[2]=F;for(intm=0;mrow_num;m++)for(intn=0;nline_num;n++)tableData[m][n]=0;tableData[0][0]=1;tableData[0][1]=2;tableData[0][2]=3;tableData[4][0]=8;tableData[4][1]=2;tableData[4][2]=3;tableData[6][1]=9;tableData[6][2]=3;tableData[7][2]=10;tableData[12][1]=14;tableData[12][2]=3;tableData[13][2]=15;}intgetCell(introwN,stringlineNa){introw=rowN;intline=getLineNumber(lineNa);if(row=0&&rowrow_num&&line=line_num)returntableData[row][line];elsereturn-1;}intgetLineNumber(stringlineNa){for(inti=0;iline_num;i++)if(lineName[i]==lineNa)returni;return-1;}};【Stack_num.h】classStack_num{inti;//栈顶标记int*data;//栈结构public:Stack_num()//构造函数{data=newint[100];i=-1;}intpush(intm)//进栈操作{i++;data[i]=m;returni;}intpop()//出栈操作{i--;returndata[i+1];}intgetTop()//返回栈顶{returndata[i];}~Stack_num()//析构函数{delete[]data;}inttopNumber(){returni;}voidoutStack(){for(intm=0;m=i;m++)coutdata[m];}};【Stack_str.h】classStack_str{inti;//栈顶标记string*data;//栈结构public:Stack_str()//构造函数{data=newstring[50];i=-1;}intpush(stringm)//进栈操作{i++;data[i]=m;returni;}intpop()//出栈操作{data[i]=;i--;returni;}stringgetTop()//返回栈顶{returndata[i];}~Stack_str()//析构函数{delete[]data;}inttopNumber(){returni;}voidoutStack(){for(intm=0;m=i;m++)coutdata[m];}};【cifa.cpp】//cifa.cpp#includeiostream#includestring#includecifa.husingnamespacestd;//关键字表和对应的编码stringcodestring[10]={main,int,if,then,else,return,void,cout,endl};intcodebook[10]={26,21,22,23,24,25,27,28,29};//全局变量charch;intflag=0;/*//主函数intmain(){WordTypeword;cout请输入源程序序列:;word=get_w();while(word.pro!=#)//#为自己设置的结束标志{cout(word.code,“word.pro”)endl;word=get_w();};return0;}*/WordTypeget_w(){stringstr=;intcode;WordTypewordtmp;getch();//读一个字符getBC();//去掉空白符if(isLetter()){//以字母开头while(isLetter()||isDigit()){str=concat(str);getch();}retract();code=Reserve(str);if(code==-1){wordtmp.code=0;wordtmp.pro=str;}//不是关键字else{wordtmp.code=co