文档介绍:《编译原理》课程设计
报告
题目:LALR(1)分析器
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
{
ArrayList<ArrayList<int[]>> core;
ArrayList<ArrayList<int[]>> Ary_c;
ArrayList <int []> producer;
private int [] copy(int []a )
{
int val[]=new int[];
for(int i=0;i<;i++)
val[i]=a[i];
return val;
}
private ArrayList<int []> copy(ArrayList<int []>a)
{
ArrayList <int []>val=new ArrayList <int []>();
for(int i=0;i<();i++)
{
(copy((i)));
}
return val;
}
public boolean isEqual(int []a,int b[])
{
if(!=)
return false;
for(int i=0;i<;i++)
if(a[i]!=b[i])
return false;
return true;
}
public boolean isEqual(ArrayList <int[]>a,ArrayList<int[]>b)
{
if(()!=())
return false;
for(int i=0;i<();i++)
if(!isEqual((i),(i)))
return false;
return true;
}
public int indexof(ArrayList <int[]>a,int []b)
{
int index;
int s1[];
for(index=0;index<();index++)
{
s1=(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;index<();index++)
{
s1=(index);
if(isEqual(s1,b)==true)
return index;
}
return -1;
}
public int []getStartWith(int i)
{
int count=i;
ArrayList<Integer> temp=new ArrayList<Integer>(3);
while(count<())
{
if((count)[0]==i)
(count);
else
if((count)[0]>i)
b