- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[编译原理课程报告
《编译原理》课程设计
报告
题目:LALR(1)分析器
姓名:粟霞
学号:0806230205
指导教师:赵洋
2011年6月
设计目的
巩固对语法分析的基本功能和原理的认识。
通过对语法分析表的自动生成加深语法分析表的认识。
理解并处理语法分析中的异常和错误。
熟练掌握LALR(1)语法分析过程。
设计内容
本次课程设计是设计一个LALR(1)语法分析器。LALR(1)是LR(1)的一种改进。为了克服LR(1)中分析表的构造对某些同心集的分裂可能对状态数目引起剧烈的增长,从而导致存储容量的急剧增加,采用对LR(1)项目集规范族合并同心集的方法,若合并同心集后不产生新的冲突,则为LALR(1)项目集。
本次课程设计的主要内容有首先生成LR(1)项目族;再合并同心集;然后生成LALR(1)项目族,求出LALR(1)的分析表;最后能判断一个字符串是否是该文法的串,若是则生成该字符串的树。
具体实现过程及相关主要实现类如下:
类:LR0
功能:LR0核心项目集构造
输入:产生式的数字化表示
输出:LR0核心项目集
实现思想:LR0核心项目集构造算法
程序如下:
public class LR0
{
ArrayListArrayListint[] core;
ArrayListArrayListint[] Ary_c;
ArrayList int [] producer;
private int [] copy(int []a )
{
int val[]=new int[a.length];
for(int i=0;ia.length;i++)
val[i]=a[i];
return val;
}
private ArrayListint [] copy(ArrayListint []a)
{
ArrayList int []val=new ArrayList int []();
for(int i=0;ia.size();i++)
{
val.add(copy(a.get(i)));
}
return val;
}
public boolean isEqual(int []a,int b[])
{
if(a.length!=b.length)
return false;
for(int i=0;ia.length;i++)
if(a[i]!=b[i])
return false;
return true;
}
public boolean isEqual(ArrayList int[]a,ArrayListint[]b)
{
if(a.size()!=b.size())
return false;
for(int i=0;ia.size();i++)
if(!isEqual(a.get(i),b.get(i)))
return false;
return true;
}
public int indexof(ArrayList int[]a,int []b)
{
int index;
int s1[];
for(index=0;indexa.size();index++)
{
s1=a.get(index);
if(isEqual(s1,b)==true)
return index;
}
return -1;
}
public int indexof(ArrayList ArrayList int[]a,ArrayList int[]b)
{
int index;
ArrayList int[]s1;
for(index=0;indexa.size();index++)
{
s1=a.get(index);
if(isEqual(s1,b)==true)
return index;
}
return -1;
}
public int []getStartWith(int i)
{
int count=i;
ArrayListInteger temp=new ArrayListInteger(3);
while(countproducer.size())
{
if(producer.get(count)[0]==i)
temp.add(count
文档评论(0)