免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4次上机语法分析2目的:熟练掌握自下而上的语法分析方法,并能用程序实现。要求:1. 使用如下文法:E E+T | T T T*F | F F (E) | id2. 对于任意给定的输入串(词法记号流)进行语法分析,要求采用LR分析器来完成。手工构造LR分析表,利用移进-归约分析算法(P69 图3.12)输出(P70 表3.8)对应的动作部分。如:输入:id*+id/(id+id)#输出:移进按 F-id归约 移进 error 3. 要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。例如:从状态0开始的记号流为:bm将b移进之后,栈里的情况应该为: 0 b 2此时查表发现 action2,m=error输出打印:error把A和状态1相继压入栈,用户指针后移到FOLLOW(A)对应的元素继续分析。0.栈. . . . a . .A发现错误I0 :Ca AcA bn. . .I 1Ca A c. . .AI 2Ab n. . .b扩展:1.利用P92页的表3.13的方式将错误进行分类提示,即给出具体的出错信息。2. 在已有文法的基础上再加上减法“-”和除法“/”对应的产生式构成最终的文法。从而使得记号流可以处理带括号的加、减、乘、除四则运算。代码实现:#include#includeusing namespace std;stack symbol;stack state;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,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;void action(int i,char *&a,char &how,int &num,char &A,int &b)/action函数i,aint 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=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)规约endl; break; case 6: A=F,b=1; coutid规约endl; break; default: break; int go(int t,char A)/gotot,Aswitch(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了,转到状态5 state.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:/缺少右括号,假设已经输入右括号,转到状态11 state.push(11); symbol.push(); cout缺少右括号endl; break;case 5: a+; cout*号无效,应该输入+号!sen; a=sen; state.push(0);/先输入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移进endl; symbol.push(*a); state.push(num); / if(*a=i) / a+;/在这里忽略i后面的d a+; else if(how=r)/规约 for(int i=0;ib;i+) if(!state.empty() state.pop(); if(!symbol.empty() symbol.pop(); i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业培训需求分析与培训计划制定方法
- 写人记事之家庭的温暖14篇
- 培训计划制定工具及模板
- 采购合同范本与审核流程模板
- 探索未来的奇妙世界想象作文5篇范文
- 我笑了小学生记事作文5篇范文
- 读后感读小王子后的心灵触动10篇
- 提高个人品德修养道德承诺书5篇
- 市场营销活动策划流程模板客户细分版
- 市场调研信息收集指南
- 2024年成人高考《政治(专升本)》考试题库(含答案)
- 2025至2030中国城市轨道交通行业市场深度分析及竞争格局与发展前景展望报告
- 小学国家中小学智慧教育平台应用案例
- 新生儿无陪护理模式探索
- (2025年)黑龙江省齐齐哈尔市辅警协警笔试笔试预测试题含答案
- 海洋大数据平台建设
- 量值溯源培训课件
- 丙烷安全培训课件
- 2025年广西专业技术人员继续教育公需科目(一)答案
- 2025年广东省考公务员考试(公安专业科目)考试试题
- 天车工高级考试题库及答案
评论
0/150
提交评论