LR(0)分析法 一.实验目的 熟练掌握自下而上的语法分析方法,会构建ACTION 集和GOTO 集,并能用程序实现对输入串的分析过程。 二.实验内容 对于一个给定的文法,如 G[E]: E->E+T|T T->T*F|F F->(E)|id 对于任意给定的输入串进行语法分析,利用移入-归约分析算法输出对应的动作部分。 三.实验步骤 1.先构造对应于文法G[E]的ACTION表和GOTO表: ACTION表的S和r信息存放至 sym中; ACTION表的S和r的下表信息存放至 snum中; GOTO表中的信息存放至 go2中。 2.调用action函数判断是按哪个式子进行归约的。 3.调用go函数对不同的非终结符进行判断,调用go2. 4.调用error函数对错误信息进行处理。 四、源代码: #include #include using namespace std; stack symbol; stack state; char sen[50]; char sym[12][6]={//符号表 {'s',' ',' ','s',' ',' '}, {' ','s',' ',' ',' ','a'}, {'r','r','s','r','r','r'}, {'r','r','r','r','r','r'}, {'s',' ',' ','s',' ',' '}, {'r','r','r','r','r','r'}, {'s',' ',' ','s',' ',' '}, {'s',' ',' ','s',' ',' '}, {' ','s',' ',' ','s',' '}, {'r','r','s','r','r','r'}, {'r','r','r','r','r','r'}, {'r','r','r','r','r','r'} }; char snum[12][6]={//数字表 {5,0,0,4,0,0}, {0,6,0,0,0,0}, {2,2,7,2,2,2}, {4,4,4,4,4,4}, {5,0,0,4,0,0}, {6,6,6,6,6,6}, {5,0,0,4,0,0}, {5,0,0,4,0,0}, {0,6,0,0,11,0}, {1,1,7,1,1,1}, {3,3,3,3,3,3}, {5,5,5,5,5,5} }; int go2[12][3]={//go2 表 {1,2,3}, {0,0,0}, {0,0,0}, {0,0,0}, {8,2,3}, {0,0,0}, {0,9,3}, {0,0,10}, {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0} }; void action(int i,char *&a,char &how,int &num,char &A,int &b)//action函数[i,a] { int j; switch(*a) { case 'i': j=0;break; case '+': j=1;break; case '*': j=2;break; case '(': j=3;break; case ')': j=4;break; case '#': j=5;break; default: j=-1;break; } if(j!=-1) { how=sym[i][j]; num=snum[i][j]; if(how=='r') { switch(num) { case 1: A='E',b=3; printf("按E->E+T规约\n"); break; case 2: A='E',b=1; printf("按E->T规约\n"); break; case 3: A='T',b=3; printf("按T->T*F规约\n");...