




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上精选优质文档-倾情为你奉上专心-专注-专业专心-专注-专业精选优质文档-倾情为你奉上专心-专注-专业lr分析器实验报告分析一、实验目的与要求: (简述本次实验要求达到的目的,涉及到的相关知识点,实验的具体要求。)目的:掌握LR(1)分析法的基本原理 掌握LR(1)分析表的构造方法 掌握LR(1)驱动程序的构造方法要求:1.对LR(1)语法规则有明确的定义;2.编写的分析程序能够对实验结果进行正确的语法分析;3.对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成。二、实验内容(根据本次实验项目的具体任务和要求,完成相关内容,可包括:实验目的、算
2、法原理、实验仪器、设备选型及连线图、算法描述或流程图、源代码、实验运行步骤、关键技术分析、测试数据与实验结果、其他) 具体任务:构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。 对下列文法,用LR(1)分析法对任意输入的符号串进行分析: (1)E-E+T(2)E-ET(3)T-T*F(4)T-T/F(5)F-(E)(6)F-i输出的格式如下:(1)LR(1)分析程序,编制人:姓名,学号,班级(2)输入一以#结束的符号串(包括+*/()i#):在此位置输入符号串 (3)输出过程如下: 步骤
3、状态栈 符号栈 剩余输入串 动作 10#i+i*i#移进 (4)输入符号串为非法符号串(或者为合法符号串) 备注:(1)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。(2) 在此位置输入符号串为用户自行输入的符号串。原理:LR分析方法是已知的最一般的无回溯移进-归约方法,它能够和其他移进-归约方法一样有效地实现。同时利用数据结构中堆栈的性质,来分析一个具体的句型。步骤:分析一个LR(1)文法的产生式。正确无误的构造一个LR(1)的项目集。根据LR(1)的项目集构建LR(1)分析表。针对具
4、体句型进行实例分析。关键技术分析:LR(1)文法中只有三个动作:移进,规约和接受,这三个动作也是通过查表得来的额,任何时候如果都是唯一确定这三个动作中的一个,我们就可以让LR(1)文法正确的运行。首先需要构建项目集,才能根据项目集的状态转换构建分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。而分析器的动作就是由栈顶状态和当前输入符号所决定。流程图:代码:#include #include #inclu
5、de using namespace std; string action126=S5,0,0,S4,0,0, /ACTION表 0,S6,0,0,0,acc, 0,r2,S7,0,r2,r2, 0,r4,r4,0,r4,r4, S5,0,0,S4,0,0, 0,r6,r6,0,r6,r6, S5,0,0,S4,0,0, S5,0,0,S4,0,0, 0,S6,0,0,S11,0, 0,r1,S7,0,r1,r1, 0,r3,r3,0,r3,r3, 0,r5,r5,0,r5,r5; int gotoarr123=1,2,3, /GOTO表 0,0,0, 0,0,0, 0,0,0, 8,2,3,
6、 0,0,0, 0,9,3, 0,0,10, 0,0,0, 0,0,0, 0,0,0, 0,0,0; char vt6=i,+,*,(,),#; /存放终结符 char vn3=E,T,F; /存放非终结符 string Production6=E-E+T,E-T,T-T*F,T-F,F-(E),F-i;/产生式集合 int count=0;/记录当前进行处理的输入字符串字符位置 int line=1;/记录处理的步骤数 bool flag=false; int StatusNumber=1;/栈中状态数 string stacktd=#;/记录符号栈中内容 int Status50=0;/记
7、录状态栈 stack Stack;/创建一个符号栈 stack status;/创建一个状态栈 void Judge(int &i,int j,char arr,char ch,string s)/判断输入串是否由文法终结符组成 flag=false; for(int l=0;lj;l+) if(ch=arrl) flag=true; i=l; break; if(flag=false) couttErrorendl; count=s.size(); void Outputstatus()/输出状态集 for(int i=0;iStatusNumber;i+) coutStatusi; voi
8、d Outputstring(string s)/输出未处理的字符串 for(int i=count;is.size();i+) couts.at(i); void Output(string s)/输出步骤、状态集、符号集、输入串coutlinet; Outputstatus(); couttstacktdt; Outputstring(s); couttt; line+; void Shift(int i,string s)/移进函数S Output(s); coutACTIONstatus.top(),s.at(count)=Si,状态i入栈endl; status.push(i);/将
9、状态i压进状态栈 StatusStatusNumber=i;/Status记录状态栈的内容 Stack.push(s.at(count);/将当前面临的输入串符号压进符号栈 stacktd=stacktd+s.at(count);/stacktd记录符号栈的内容 count+;/当前面临的输入串字符往后移一位 StatusNumber+;/状态数加一 void Goto(stack st1,stack st2,string s)/GoTo语句 int j=-1; int ch1=st1.top(); char ch2=st2.top(); Judge(j,3,vn,ch2,s);/求得ch2在
10、非终结符表中的位置 if(gotoarrch1j=0) couttErrorendl; count=s.size(); else status.push(gotoarrch1j);/新状态进栈 StatusStatusNumber=gotoarrch1j; StatusNumber+; void Reduction(int i,string s)/归约函数R Output(s); coutri:Productioni-1归约,GoTo(; int N=Productioni-1.length()-3; for(int j=0;jN;j+)/消除要归约的状态及符号 status.pop(); S
11、tack.pop(); StatusNumber-; stacktd.erase(stacktd.length()-1); coutstatus.top(),Productioni-1.at(0)=; Stack.push(Productioni-1.at(0);/符号进栈 stacktd=stacktd+Stack.top(); Goto(status,Stack,s); coutstatus.top()入栈endl; StatusStatusNumber=status.top(); void Analyse(string s)/具体分析函数 Stack.push(#);/初始化 statu
12、s.push(0); s=s+#; int t=-1;/记录ch在数组vt的位置 while(counts.size() int i=status.top(); char ch=s.at(count); Judge(t,6,vt,ch,s); if(flag=true) if(actionit!=acc&actionit!=0) if(actionit.at(0)=S) actionit.erase(0,1); /删除actionit的首字母S Shift(atoi(actionit.c_str(),s);/atoi(actionit.c_str(),将actionit转换为整型 action
13、it.insert(0,S);/将S添加回actionit else if(actionit.at(0)=r) actionit.erase(0,1);/删除actionit的首字母r Reduction(atoi(actionit.c_str(),s);/atoi(actionit.c_str(),将actionit转换为整型 actionit.insert(0,r);/将r添加回actionit else if(actionit=0) couttErrorendl; break; else if(actionit=acc) Output(s); coutacct分析成功endl; brea
14、k; else if(flag=false) break; int main() string s; cout*LR(1)分析*endl; cout本分析文法产生式为endl; for(int j=0;j6;j+) coutProductionjendl; cout*LR(1)分析*endl; char T; do cout输入字符串s;/输入要分析的字符串 cout*现进行如下分析 *endl; cout步骤t状态栈t符号栈t剩余输入串t动作说明endl; Analyse(s); count=0;/记录当前进行处理的输入字符串字符位置 line=1;/记录处理的步骤数 stacktd=#;
15、StatusNumber=1; while(!Stack.empty() Stack.pop(); while(!status.empty() status.pop(); cout是否继续分析,Y或y继续T; while(T=y|T=Y); return 0; 截图: 三、实验分析与小结:(实验过程中的问题分析、产生的原因以及解决方法;实验结果分析; 有待优化思路) 经过这个实验的练习,通过对程序的分析,让我进一步了解LR(1)算法的思想以及它的进一步程序实现,让我对它的了解从简单的理论上升到程序实现的级别,有理论上升到实际,让我更清楚它的用途。在对实验的分析的时候,也遇到很多的问题,尽管上一个LL(1)分析法有些启发,但是刚开始根本想不到用程序怎么实现这么繁杂的LR(1)文法,后来看了程序才知道,才转过来弯,通过对这个程序的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025YY经济适用房买卖合同
- 2025标准化专业建设合同范本
- 废物利用小学课件
- 2025年电缆沟施工及维护合同
- 2025管理人员合同管理制度规定
- 2024-2025人教版一年级下册数学期中考试试卷附参考答案
- 2025保险公司担保合同范本
- 2025济南市汽车租赁合同模板济南市汽车租赁合同格式
- 2025个人二手车交易合同
- 2025塔机租赁合同签订要点与防范工程骗局
- GB/T 3785.3-2018电声学声级计第3部分:周期试验
- GB/T 28462-2012机织起绒合成革基布
- 接触网工复习题库及答案
- 儿童泌尿道感染(课堂PPT)
- 全国压力容器设计单位名录
- 特变电工-财务报表分析课件
- 人民医院人才队伍建设规划人才队伍建设五年规划
- 一年级语文下册课件-21 小壁虎借尾巴24-部编版(15张PPT)
- 患者随访率低原因分析以及对策
- 计量认证实验室程序文件(全套)
- DGC型瓦斯含量直接测定装置使用说明书
评论
0/150
提交评论