第4次上机—语法分析2_第1页
第4次上机—语法分析2_第2页
第4次上机—语法分析2_第3页
第4次上机—语法分析2_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5 / 6第4次上机一语法分析2目的:熟练掌握自下而上的语法分析方法,并能用程序实现。 要求:1. 使用如下文法:E? E+T | T(词法记号流)进行语法分析,要求采用 -归约分析算法(T ? T*F | F F ? (E) | idLR分析器来完成。手工P69图3.12)输出(P70表3.8)对应的动作部2. 对于任意给定的输入串 构造LR分析表,利用移进分。如:b5E2RGbCA P 输入:id*+id/(id+id)#输出:移进按F-id归约移进error3.要有一定的错误处理功能。 进行接下来的分析。 例如: 从状态0开始的记号流为:即对错误能提示,bm并且能在一定程度上忽略尽量少的

2、记号来将b移进之后,栈里的情况应该为: 此时查表发现 actio n 2,m=error 输出打印:error 把A和状态1相继压入栈,用户指针后移到FOLLOW(A)对应的元素继续分析。栈发现错误A . a .plEanqFD Pw扩展:1利用P92页的表3.13的方式将错误进行分类提示,即给出具体的出错信息。2.在已有文法的基础上再加上减法和除法“ /对应的产生式构成最终的文法。从而使得记号流可以处理带括号的加、减、乘、除四则运算。DXDiTa9E3d代码实现: #include #include using namespace std; stack symbol; stack state

3、; char sen50; char sym126=/ 符号表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,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;char snum126=/ 数字表5,1,1,4,2,1, 3,6,5,3,2,0, 2,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、,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;int go2123=/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,0;函数 i,a RTCrpUDGiTvoid action(int i,char *&a,char &how,int &num,char &A,int &b)/action int j;switch(*a)case i:j=0;break;case +:j=1;break;case *:j=2;

5、break; case (:j=3;break; case ):j=4;break;case #:j=5;break;default:j=-1;break;if(j!=-1)how=symij; num=snumij; if(how=r)switch(num) case 1:A=E,b=3;coutE+T 规约 endl; break;case 2:A=E,b=1;coutT 规约endl;break;case 3:A=T,b=3;coutT*F 规约 endl;break;case 4:A=T,b=1;coutF 规约 endl; break;case 5:A=F,b=3;cout(E)规约

6、endl; break;case 6:A=F,b=1;coutid 规约endl;break;default:break;int go(int t,char A)/gotot,A switch(A)case E:return go2t0;break;case T:return go2t1;break;case F:return go2t2;break;void error(int i,int j,char *&a)/error 处理函数couterrorendl;switch(j)case 1:/期望输入 id 或左括号 ,但是碰到 +,*,或 $,就假设已经输入 id 了,转到状态 5sta

7、te.push(5);symbol.push(i);/ 必须有这个 ,如果假设输入 id 的话 ,符号栈里必须有 cout 缺少运算对象 idendl;break;case 2:/从输入中删除右括号a+;cout 不配对的右括号 endl;break;case 3:/期望碰到 +,但是输入 id 或左括号 ,假设已经输入算符 +,转到状态 6 state.push(6);symbol.push(+);cout 缺少运算符 endl;break;case 4:/缺少右括号 ,假设已经输入右括号 ,转到状态 11state.push(11); symbol.push();cout 缺少右括号 en

8、dl;break;case 5:a+;cout* 号无效 ,应该输入 +号 !sen;a=sen;state.push(O);/先输入 0 状态while(*a!=0)b=0;num=0;how=0;A=0;s=state.top();action(s,a,how,num,A,b);if(how=s)/ 移进cout移进e ndl;symbol.push(*a);state.push(num);/if(*a=i)/a+;/在这里忽略i后面的da+;else if(how=r)/ 规约for(int i=0;ib;i+)if(!state.empty() state.pop();if(!symbol.empty() symbol.pop()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论