lr-分析方法程序设计原理与实现技术实验报告及源代码-北京交通大学

上传人:aa****6 文档编号:38152976 上传时间:2018-04-27 格式:PDF 页数:23 大小:430.60KB
返回 下载 相关 举报
lr-分析方法程序设计原理与实现技术实验报告及源代码-北京交通大学_第1页
第1页 / 共23页
lr-分析方法程序设计原理与实现技术实验报告及源代码-北京交通大学_第2页
第2页 / 共23页
lr-分析方法程序设计原理与实现技术实验报告及源代码-北京交通大学_第3页
第3页 / 共23页
lr-分析方法程序设计原理与实现技术实验报告及源代码-北京交通大学_第4页
第4页 / 共23页
lr-分析方法程序设计原理与实现技术实验报告及源代码-北京交通大学_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《lr-分析方法程序设计原理与实现技术实验报告及源代码-北京交通大学》由会员分享,可在线阅读,更多相关《lr-分析方法程序设计原理与实现技术实验报告及源代码-北京交通大学(23页珍藏版)》请在金锄头文库上搜索。

1、LR 分析方法程序设计原理与实现技术分析方法程序设计原理与实现技术XXX 1028XXX 计科 1XXX 班1.1.程序功能描述程序功能描述通过设计、编写和构造LR(0)项目集规范簇和LR 分析表、对给定的符号串进行LR 分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G 出发生成LR(0)分析表,并对给定的符号串进行分析。要求以表格或图形的方式实现。实现LR(0)分析法,完成以下文法。GE:EaAbBAcAdBcBd2.2. 设计要求设计要求(1)构造LR(0)项目集规范簇;要求输入LR(0)文法时,可以直接输入,也可以读取文件,并能够以表格的形式输出项目集规范簇集识别活

2、前缀的有穷自动机(2)构造LR(0)分析表。要求要求输入LR(0)文法时,可以直接输入,也可以读取文件;输出项目集规范簇,可以调用前一处理部分的结果,输出为LR(0)分析表(3)LR(0)分析过程【移进、归约、接受、报错】的实现。要求调用前一部分处理结果的分析表,输入一个符号串,依据LR(0)分析表输出与句子对应的语法树,或直接以表格形式输出分析过程。3.3. 主要数据结构描述:主要数据结构描述:文法表示,项目集规范族表示以及文法接受的符号和移植到的位置:4.4. 程序结构描述程序结构描述本程序一共有 10 个功能函数:void get();/获取文法 void print();/打印文法 v

3、oid fun();/构造 LR(0)项目集规范族 void analy();/构造 LR(0)分析表 void test();/测试文法 int equal(progect p1,progect p2);/判断两项是否相等 int findpoint(string str);/判断点的位置是否在最后,是的话就 是规约项目 int findlocal(string str);/寻找此符号串对应的规范族的位置 char gettype(char ch,int num);/根据状态集,返回操作的类别(移近, 规约,接受) int getnumber(char ch,int nun);/根据状态机,

4、返回下一步所跳转的状 态集5.5. 实验代码实验代码详见附件struct grammar/文法 char left; vector right; ; struct grammar1 char left; vector right; int sign; ; struct define int data; char type; ; struct progect/项集 vector data;/数据 vector acc;/可接受的符号 vector next;/转移到的位置 ; vector lge;/文法 vector pro;/项目集规范族6.6. 程序测试程序测试6.16.1 功能测试功能测

5、试程序运行后显示如下功能菜单:选择获取文法:选择打印文法:选择构造 LR(0)项目集规范族:选择构造 LR(0)分析表:6.26.2 文法测试文法测试分析失败:aAcAd分析成功:acd7.7. 实验总结:实验总结:本次实验按照书上的相应步骤, 一步一步按照要求来完成实现, 最终文成了给定文法的分析程序。首先是获取文法,文法的获取是采用直接输入的方法,保存成预先设定的结构体,然后根据文法,对文法编号,求出项目集规范族,然后再构造 LR(0)分析表,最后根据分析表来判断输入符号串是否为此文法产生的语言。这次实验花费的时间比较长, 因为用 c 语言在编写项目集族以及构造分析表的算法都遇到了一些困难

6、,需要再实验中边写边学习。在完成实验后,我对 LR(0)文法有了更加深入的了解。/ lr0.cpp : 定义控制台应用程序的入口点。/#include “stdafx.h“#include #include #include using namespace std;struct grammar/文法char left;vector right;struct grammar1char left;vector right;int sign;struct defineint data;char type;struct progect/项目集vector data;/数据vector acc;/可接受

7、的符号vector next;/转移到的位置;vector lge;/文法vector pro;/项目集规范族void get();/获取文法void print();/打印文法void fun();/构造 LR(0)项目集规范族void analy();/构造 LR(0)分析表void test();/测试文法int equal(progect p1,progect p2);/判断两项是否相等int findpoint(string str);/判断点的位置是否在最后,是的话就是规约项目int findlocal(string str);/寻找此符号串对应的规范族的位置char gettyp

8、e(char ch,int num);/根据状态集,返回操作的类别(移近,规约,接受)int getnumber(char ch,int nun);/根据状态机,返回下一步所跳转的状态集int main()int choose;while(1)cout choose;if(choose = 0)break;switch(choose)case 1:get();break;case 2:print();break;case 3:fun();break;case 4:analy();break;case 5:test();break;default:break;return 0;void get(

9、)grammar temp,temp1,temp2;temp.left = E;temp.right.push_back(“aA“);temp.right.push_back(“bB“);temp1.left = A;temp1.right.push_back(“cA“);temp1.right.push_back(“d“);temp2.left = B;temp2.right.push_back(“cB“);temp2.right.push_back(“d“);lge.push_back(temp);lge.push_back(temp1);lge.push_back(temp2);cout

10、 “;cout = A sign = 1;for(int k = 0;k = A cout Z | tempt str;cout endl;string temp = “;int i,j;int num = 0;/初始状态int count = 0;/字符串指针char ch = strcount;temp += strcount;/放入第一个符号while(1)if(gettype(ch,num) = s)/移近num = getnumber(ch,num);if(count str.length() - 1)count +;temp += strcount;ch = strcount;el

11、se if(gettype(ch,num) = r)/规约num = getnumber(ch,num);/规约式子编号if(num = -1)cout “success“ endl;cout“*“endl;cout endl;break;char left;/规约式子左部string right;/规约式子右部int tt = 0;for(i = 0;i lge.size();i +)for(j = 0;j lgei.right.size();j +)tt +;if(tt = num)left = lgei.left;right = lgei.rightj;string temp1 = “;

12、for(i = 0;i temp.length() - right.length();i +)temp1 += tempi;temp1 += left;temp = temp1;elsecout “failure“ endl;cout “*“ endl;cout endl;break;int equal(progect p1,progect p2)int i,j;if(p1.data.size() = p2.data.size()for(i = 0;i p1.data.size();i +)if(p1.datai.left = p2.datai.left)if(p1.datai.right.s

13、ize() = p2.datai.right.size()for(j = 0;j p1.datai.right.size();j +)if(p1.datai.rightj != p2.datai.rightj)return 0;elsereturn 0;elsereturn 0;elsereturn 0;return 1;int findpoint(string str)int i;for(i = 0;i str.length() - 1;i +)if(stri = .)return 1;return 0;int findlocal(string str)if(findpoint(str)/不

14、在最后,不是规约项目string temp = “;/点移位int i,j;for(i = 0;i str.length();i +)if(stri != .)temp += stri;elsebreak;i +;temp += stri;i +;temp += “.“;for(;i str.length();i +)temp += stri;for(i = 0;i pro.size();i +)for(j = 0;j proi.data.size();j +)if(temp = proi.dataj.right0)return i;else /规约项目string temp = “; /去除

15、点int i,j;for(i = 0;i str.length();i +)if(stri != .)temp += stri;if(temp = “E“) /accreturn -1;int count = 1;for(i = 0;i lge.size();i +)for(j = 0;j lgei.right.size();j +)if(temp != lgei.rightj)count +;elsereturn count;char gettype(char ch,int num)for(int i = 0;i pronum.acc.size();i +)if(pronum.acci = ch)return pronum.nexti.type;return NULL;int get

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号