大连理工大学软件学院编译原理第四次作业-语法分析_第1页
大连理工大学软件学院编译原理第四次作业-语法分析_第2页
大连理工大学软件学院编译原理第四次作业-语法分析_第3页
大连理工大学软件学院编译原理第四次作业-语法分析_第4页
全文预览已结束

下载本文档

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

文档简介

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开始的

2、记号流为:bm将b移进之后,栈里的情况应该为: 0 b 2此时查表发现 action2,m=error输出打印:error把A和状态1相继压入栈,用户指针后移到FOLLOW(A)对应的元素继续分析。0.栈. . . . a . .A发现错误I0 :C®a ·AcA®· bn. . .I 1C®a A ·c. . .AI 2A®b · n. . .b扩展:1.利用P92页的表3.13的方式将错误进行分类提示,即给出具体的出错信息。2. 在已有文法的基础上再加上减法“-”和除法“/”对应的产生式构成最终的文法。从而使得

3、记号流可以处理带括号的加、减、乘、除四则运算。#include<iostream>#include<fstream>#include<string>#include<stack>using namespace std;stack<int> astack;int i=0,b,c,a;/a为输入符号,即table数组列,b为table数组行 char temp1000;string wenfa6="按E->E+T规约","按E->T规约","按T->T*F规约"

4、,"按T->F规约","按F->(E)规约","按F->id规约"int table129=/*数组列,id=0,+=1,*=2,(=3,)=4,$=5,E=6,T=7,F=8 ;行为状态, 表中所存数字011代表移进;1217代表按16产生式规约,-1代表接受状态*/ 5,-2,-2,4,-3,-2,1,2,3,-4,6,-4,-4,-3,-1,-2,-2,-2,13,13,7,13,13,13,-2,-2,-2,15,15,15,15,15,15,-2,-2,-2,5,-2,-2,4,-3,-2,8,2,3,17

5、,17,17,17,17,17,-2,-2,-2,5,-2,-2,4,-3,-2,-2,9,3,5,-2,-2,4,-3,-2,-2,-2,10,-4,6,-4,-4,11,-5,-2,-2,-2,12,12,7,12,12,12,-2,-2,-2,14,14,14,14,14,14,-2,-2,-2,16,16,16,16,16,16,-2,-2,-2;void Analysis()i=0;while('#'!=tempi)if('i'=tempi) a=0; if('+'=tempi) a=1; if('('=tempi) a

6、=3; if(')'=tempi) a=4; if('*'=tempi) a=2; if('$'=tempi) a=5; if('E'=tempi) a=6; if('T'=tempi) a=7; if('F'=tempi) a=8;b=astack.top(); c=tableba;if(-1=c)cout<<"接受"<<endl;break; if(c>=0&&c<=11)cout<<"移进"

7、<<endl; astack.push(c);if(0=a) i+;i+; if(c>=12)cout<<wenfac-12<<endl;if(c=12|c=14|c=16) astack.pop(); astack.pop();astack.pop();else astack.pop();b=astack.top();astack.push(tablebc/2); if(-2=c)cout<<"error,缺少运算对象"<<endl;/状态5进栈astack.push(5);if(-3=c)cout<<"error,不配对的右括号"<<endl;/从输入中删除右括号i+;if(-4=c)cout<<"error,缺少运算符+"<<endl;/状态6进栈astack.push(6);if(-5=c)cout<<"error,缺少右括号"<<endl;/状态11入栈astack.push(11);void main()ifstream i

温馨提示

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

评论

0/150

提交评论