实验4 LR(1)分析法.doc_第1页
实验4 LR(1)分析法.doc_第2页
实验4 LR(1)分析法.doc_第3页
实验4 LR(1)分析法.doc_第4页
实验4 LR(1)分析法.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

河南工业大学实验报告课程名称 编译原理 _ 实验项目 实验四 LR(1)分析法 院 系_信息科学与工程学院_ 专业班级 计科F1402班 姓 名 苏朋辉 学 号 201416010211 指导老师 侯惠芳 日 期 2017.5.6 批改日期 成 绩 一. 实验目的1掌握LR(1)分析法的基本原理2掌握LR(1)分析表的构造方法3掌握LR(1)驱动程序的构造方法二. 实验内容及要求构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。根据某一文法编制调试LR(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对LR(1)分析法的理解。程序输入/输出示例:对下列文法,用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)输出过程如下:步骤 状态栈 符号栈 剩余输入串动作10#i+i*i#移进(4)输入符号串为非法符号串(或者为合法符号串)备注:(1)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。(2) 在此位置输入符号串为用户自行输入的符号串。注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;4可采用的其它的文法。三. 实验过程3.1 代码如下:#include#include#include#includeusing namespace std;/初始化预测分析表string action126=s5, error, error, s4, error, error, error, s6, error, error, error, acc, error, r2, s7, error, r2, r2, error, r4, r4, error, r4, r4,s5, error, error, s4, error, error, error, r6, r6, error, r6, r6,s5, error, error, s4, error, error, s5, error, error, s4, error, error, error, s6, error, error, s11, error, error, r1, r7, error, r1, r1, error, r3, r3, error, r3, r3,error, r5, r5, error, r5, r5;string go123 = 1, 2, 3,error, error, error, error, error, error, error, error, error, 8, 2, 3,error, error, error, error, 9, 3,error, error, 10, error, error, error, error, error, error, error, error, error, error, error, error,;char Vt6 = i, +, *, (, ), #; /终结符表string LR6 = E-E+T, E-T, T-T*F, T-F, F-(E), F-i; /LR文法stack S;/状态栈stack X;/符号栈char input10;/输入字符int num(string s) /判断字符串中的数字int i; string str = ; for(int j = 0; j = 0 & sj = 9)str = str + sj; i = atoi(str.c_str(); return i;void preview(char *c)for(int j = 0; cj!=#; j+)cout cj;cout endl;void print(int i, char *c) /剩余输入串的输出for(int j = i; cj-1!=#; j+)cout cj;cout t;int same(char a) /用于查找终结符for(int i=0;i6;i+)if(a=Vti)return i;return -1;void analyse()/*分析程序bool flag = true; /循环条件控制int step = 1, point = 0, state = 0; /步骤、指针、状态char ch1,ch2;int m, n, l; /用于判断终结符,分析表,表达式右部的长度string str1;/用于判断对应分析表中的符号string str2 = #, str3 = 0; /记录符号栈的所有元素cout姓名:苏朋辉 学号:201416010211 班级:计科F1402班endlendl;cout请输入要规约的字符串,并以#号结束:input;cout 您输入的字符串为:;preview(input);X.push(#);S.push(0);cout 步骤 t 状态栈 t 符号栈 t 输入串 t 动作 endl;cout step+ t str3 t str2 t;print(point, input);cout 初始化 endl; /*初始化while(flag)/*进入循环state = S.top();ch1 = inputpoint;m = same(ch1);str1 = actionstatem;/*移进动作if(str10=s)n=num(str1);S.push(n);X.push(ch1);str2=str2+ch1;ch2=n+48;str3=str3+ch2;point+;cout step+ t str3 t str2 t;print(point, input);cout str1 : 移进 endl;else if(str10=r)/*归约动作n=num(str1);l = LRn - 1.length() - 3;for(int i = 1; i = l; i+)S.pop();str3 = str3.substr(0, str3.length() - 1);X.pop();str2 = str2.substr(0, str2.length() - 1);X.push(LRn - 10);str2 = str2 + LRn - 10;state = S.top();if(LRn - 10 = E)S.push(num(gostate0);ch2 = num(gostate0) + 48;str3 = str3 + ch2;else if(LRn - 10 = T)S.push(num(gostate1);ch2 = num(gostate1) + 48;str3 = str3 + ch2;else if(LRn - 10 = F)S.push(num(gostate2);ch2 = num(gostate2) + 48;str3 = str3 + ch2;cout step+ t str3 t str2 t;print(point, input);cout str1 : LRn - 1 归约 endl;/*出错else if(str1=error)cout Error!n 程序错误,分析结束! endl;flag = false;/*分析成功else if(str1 = acc)cout Acc!n分析成功,终止程序! endl;flag = false;int main()analyse();return 0;3.2 运行结果如图2 ,图3 图 2 图 34、 实验总结(心得) 通过完成实验,对LR(1)分析法的

温馨提示

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

评论

0/150

提交评论