- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
.
..
LR 分析方法程序设计原理与实现技术
XXX 1028XXX 计科1XXX班
程序功能描述
` 通过设计、编写和构造LR(0)项目集规范簇和LR 分析表、对给定的符号串进行LR 分析的程序,了解构造LR(0)分析表的步骤,对文法的要求,能够从文法G 出发生成LR(0)分析表,并对给定的符号串进行分析。要求以表格或图形的方式实现。
实现LR(0)分析法,完成以下文法。
G[E]:
E→aA∣bB
A→cA∣d
B→cB∣d
2. 设计要求
(1)构造LR(0)项目集规范簇;要求输入LR(0)文法时,可以直接输入,也可以读取文件,并能够以表格的形式输出项目集规范簇集识别活前缀的有穷自动机(2)构造LR(0)分析表。要求要求输入LR(0)文法时,可以直接输入,也可以读取文件;输出项目集规范簇,可以调用前一处理部分的结果,输出为LR(0)分析表(3)LR(0)分析过程【移进、归约、接受、报错】的实现。要求调用前一部分处理结果的分析表,输入一个符号串,依据LR(0)分析表输出与句子对应的语法树,或直接以表格形式输出分析过程。
3. 主要数据结构描述:
文法表示,项目集规范族表示以及文法接受的符号和移植到的位置:
struct
struct grammar{ //文法
char left;
vectorstring right;
};
struct grammar1{
char left;
vectorstring right;
int sign;
};
struct define{
int data;
char type;
};
struct progect{ //项集
vectorgrammar1 data; //数据
vectorchar acc; //可接受的符号
vectordefine next; //转移到的位置
};
vectorgrammar lge; //文法
vectorprogect pro; //项目集规范族
4. 程序结构描述
本程序一共有10个功能函数:
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 gettype(char ch,int num); //根据状态集,返回操作的类别(移近,规约,接受)
int getnumber(char ch,int nun); //根据状态机,返回下一步所跳转的状态集
5. 实验代码
详见附件
6. 程序测试
6.1功能测试
程序运行后显示如下功能菜单:
选择获取文法:
选择打印文法:
选择构造LR(0)项目集规范族:
选择构造LR(0)分析表:
6.2文法测试
分析失败:aAcAd
分析成功:acd
7. 实验总结:
本次实验按照书上的相应步骤,一步一步按照要求来完成实现,最终文成了给定文法的分析程序。首先是获取文法,文法的获取是采用直接输入的方法,保存成预先设定的结构体,然后根据文法,对文法编号,求出项目集规范族,然后再构造LR(0)分析表,最后根据分析表来判断输入符号串是否为此文法产生的语言。
这次实验花费的时间比较长,因为用c语言在编写项目集族以及构造分析表的算法都遇到了一些困难,需要再实验中边写边学习。在完成实验后,我对LR(0)文法有了更加深入的了解。
// lr0.cpp : 定义控制台应用程序的入口点。
//
#include stdafx.h
#include iostream
#include string
#include vector
using namespace std;
struct grammar{ //文法
char left;
vectorstring right;
};
struct grammar1{
char left;
vectorstring right;
int sign;
};
struct define{
int data;
char type;
};
struct progect{ //项目集
vectorgrammar1 data; //数据
vectorchar acc;
文档评论(0)