资源描述:
《语法分析lr分析器》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第4次上机—语法分析2目的:熟练掌握自下而上的语法分析方法,并能用程序实现。要求:1.使用如下文法:E®E+T
2、TT®T*F
3、FF®(E)
4、id2.对于任意给定的输入串(词法记号流)进行语法分析,要求采用LR分析器来完成。手工构造LR分析表,利用移进-归约分析算法(P69图3.12)输出(P70表3.8)对应的动作部分。如:输入:id*+id/(id+id)#输出:移进按F->id归约移进error……3.要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。例如
5、:从状态0开始的记号流为:bm将b移进之后,栈里的情况应该为:0b2此时查表发现action[2,m]=error输出打印:error把A和状态1相继压入栈,用户指针后移到FOLLOW(A)对应的元素继续分析。0......栈.....a..A发现错误I0:C®a·AcA®·bn...I1C®aA·c...AI2A®b·n...b扩展:1.利用P92页的表3.13的方式将错误进行分类提示,即给出具体的出错信息。2.在已有文法的基础上再加上减法“-”和除法“/”对应的产生式构成最终的文法。从而使得记号流可
6、以处理带括号的加、减、乘、除四则运算。代码实现:#include#includeusingnamespacestd;stacksymbol;stackstate;charsen[50];charsym[12][6]={//符号表{'s','e','e','s','e','e'},{'e','s','e','e','e','a'},{'r','r','s','r','r','r'},{'r','r','r','r','r','r'},{'s','e'
7、,'e','s','e','e'},{'r','r','r','r','r','r'},{'s','e','e','s','e','e'},{'s','e','e','s','e','e'},{'e','s','e','e','s','e'},{'r','r','s','r','r','r'},{'r','r','r','r','r','r'},{'r','r','r','r','r','r'}};charsnum[12][6]={//数字表{5,1,1,4,2,1},{3,6,5,3,2,0},{2,
8、2,7,2,2,2},{4,4,4,4,4,4},{5,1,1,4,2,1},{6,6,6,6,6,6},{5,1,1,4,2,1},{5,1,1,4,2,1},{3,6,5,3,11,4},{1,1,7,1,1,1},{3,3,3,3,3,3},{5,5,5,5,5,5}};intgo2[12][3]={//goto表{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
9、,0}};voidaction(inti,char*&a,char&how,int&num,char&A,int&b)//action函数[i,a]{intj;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]
10、[j];if(how=='r'){switch(num){case1:A='E',b=3;cout<<"按E->E+T规约"<T规约"<T*F规约"<F规约"<(E)规约"<11、;case6:A='F',b=1;cout<<"按F->id规约"<