《编译原理》课程设计报告LALR分析器

上传人:工**** 文档编号:431731631 上传时间:2023-07-29 格式:DOC 页数:32 大小:272.50KB
返回 下载 相关 举报
《编译原理》课程设计报告LALR分析器_第1页
第1页 / 共32页
《编译原理》课程设计报告LALR分析器_第2页
第2页 / 共32页
《编译原理》课程设计报告LALR分析器_第3页
第3页 / 共32页
《编译原理》课程设计报告LALR分析器_第4页
第4页 / 共32页
《编译原理》课程设计报告LALR分析器_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《《编译原理》课程设计报告LALR分析器》由会员分享,可在线阅读,更多相关《《编译原理》课程设计报告LALR分析器(32页珍藏版)》请在金锄头文库上搜索。

1、编译原理课程设计报告 题目:LALR(1)分析器 2011年6月一 设计目的 1 巩固对语法分析的基本功能和原理的认识。2 通过对语法分析表的自动生成加深语法分析表的认识。3 理解并处理语法分析中的异常和错误。4 熟练掌握LALR(1)语法分析过程。二 设计内容本次课程设计是设计一个LALR(1)语法分析器。LALR(1)是LR(1)的一种改进。为了克服LR(1)中分析表的构造对某些同心集的分裂可能对状态数目引起剧烈的增长,从而导致存储容量的急剧增加,采用对LR(1)项目集规范族合并同心集的方法,若合并同心集后不产生新的冲突,则为LALR(1)项目集。本次课程设计的主要内容有首先生成LR(1)

2、项目族;再合并同心集;然后生成LALR(1)项目族,求出LALR(1)的分析表;最后能判断一个字符串是否是该文法的串,若是则生成该字符串的树。具体实现过程及相关主要实现类如下:类:LR0功能:LR0核心项目集构造输入:产生式的数字化表示输出:LR0核心项目集实现思想:LR0核心项目集构造算法程序如下:public class LR0ArrayListArrayList core;ArrayListArrayList Ary_c;ArrayList producer;private int copy(int a )int val=new inta.length;for(int i=0;ia.le

3、ngth;i+)vali=ai;return val;private ArrayList copy(ArrayLista)ArrayList val=new ArrayList ();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(ai!=bi)return false;return true;public boolean isEqu

4、al(ArrayList a,ArrayListb)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 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 in

5、dexof(ArrayList ArrayList a,ArrayList b)int index;ArrayList 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;ArrayList temp=new ArrayList(3);while(counti)break;count+;int val=new inttemp.size();for(count=0;coun

6、ttemp.size();count+)valcount=temp.get(count);return val;public void closuer_innal(int item,ArrayList pos)if(item.length=2)return ;int i;int p;for(i=0;iitem.length&itemi!=-1;i+);if(item.length-1=i)return ;if(itemi+11000)p=getStartWith(itemi+1);for(i=0;ip.length;i+)if(pos.indexOf(pi)=-1)pos.add(pi);cl

7、osuer_innal(producer.get(pi),pos);return ;public ArrayList closure(int a) /求闭包ArrayList val=new ArrayList();ArrayList pos=new ArrayList();closuer_innal(a,pos);for(int i=0;ipos.size();i+)val.add(copy(producer.get(pos.get(i);return val;public ArrayList Goto(ArrayLista,int x)int index1=0,index2=0,index

8、3,bl,index=0;int s1,s2; ArrayList temp1 = new ArrayList (); /临时ArrayList temp2 = new ArrayList ();temp1=copy(a);s1=temp1.get(index1);if(s1=null)return null;while(s1index2!=-1)index2+;if(s1.length=index2)return null;index2+;for(index3=0;index3temp1.size();index3+)s1=copy(temp1.get(index3);if(s1.lengt

9、hindex2+1) /防止Array溢出continue;if(s1index2=x&indexof(temp2,s1)0)bl=s1index2-1;s1index2-1=s1index2;s1index2=bl; /-1往后移位temp2.add(copy(s1);bl=temp2.size();for(index=0;indexbl;index+) /求goto函数中的返回值的closure集s1=copy(temp2.get(index);temp1=closure(s1);for(index1=0;index1temp1.size();index1+)s2=temp1.get(in

10、dex1);if(indexof(temp2,s2)0)temp2.add(s2);return temp2;public LR0(ArrayList p)core =new ArrayListArrayList();Ary_c=new ArrayListArrayList();producer=p;public void total()ArrayList cur=new ArrayList();cur.add(producer.get(0);core.add(cur);int i=0;while(icore.size()cur=core.get(i);LR0Split(cur);i+;upd

11、ate();public void LR0Split(ArrayListcur)ArrayList handle=copy(cur);ArrayList tempal;int temp;int prod;int start;ArrayList result=new ArrayList();ArrayList val=new ArrayList();int j;for(int i=0;icur.size();i+)tempal=closure(cur.get(i);for(j=0;jtempal.size();j+)if(indexof(handle,tempal.get(j)=-1)handle.add(tempal.get(j);while(!hand

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

当前位置:首页 > 学术论文 > 其它学术论文

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