编译原理课程报告.docx
- 文档编号:30156185
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:49
- 大小:157.58KB
编译原理课程报告.docx
《编译原理课程报告.docx》由会员分享,可在线阅读,更多相关《编译原理课程报告.docx(49页珍藏版)》请在冰豆网上搜索。
编译原理课程报告
《编译原理》课程设计
报告
题目:
LALR
(1)分析器
2011年6月
一.设计目的
1.巩固对语法分析的基本功能和原理的认识。
2.通过对语法分析表的自动生成加深语法分析表的认识。
3.理解并处理语法分析中的异常和错误。
4.熟练掌握LALR
(1)语法分析过程。
二.设计内容
本次课程设计是设计一个LALR
(1)语法分析器。
LALR
(1)是LR
(1)的一种改进。
为了克服LR
(1)中分析表的构造对某些同心集的分裂可能对状态数目引起剧烈的增长,从而导致存储容量的急剧增加,采用对LR
(1)项目集规范族合并同心集的方法,若合并同心集后不产生新的冲突,则为LALR
(1)项目集。
本次课程设计的主要内容有首先生成LR
(1)项目族;再合并同心集;然后生成LALR
(1)项目族,求出LALR
(1)的分析表;最后能判断一个字符串是否是该文法的串,若是则生成该字符串的树。
具体实现过程及相关主要实现类如下:
类:
LR0
功能:
LR0核心项目集构造
输入:
产生式的数字化表示
输出:
LR0核心项目集
实现思想:
LR0核心项目集构造算法
程序如下:
publicclassLR0
{
ArrayList
ArrayList
ArrayList
privateint[]copy(int[]a)
{
intval[]=newint[a.length];
for(inti=0;i val[i]=a[i]; returnval; } privateArrayList { ArrayList for(inti=0;i { val.add(copy(a.get(i))); } returnval; } publicbooleanisEqual(int[]a,intb[]) { if(a.length! =b.length) returnfalse; for(inti=0;i if(a[i]! =b[i]) returnfalse; returntrue; } publicbooleanisEqual(ArrayList { if(a.size()! =b.size()) returnfalse; for(inti=0;i if(! isEqual(a.get(i),b.get(i))) returnfalse; returntrue; } publicintindexof(ArrayList { intindex; ints1[]; for(index=0;index { s1=a.get(index); if(isEqual(s1,b)==true) returnindex; } return-1; } publicintindexof(ArrayList { intindex; ArrayList for(index=0;index { s1=a.get(index); if(isEqual(s1,b)==true) returnindex; } return-1; } publicint[]getStartWith(inti) { intcount=i; ArrayList while(count { if(producer.get(count)[0]==i) temp.add(count); else if(producer.get(count)[0]>i) break; count++; } intval[]=newint[temp.size()]; for(count=0;count val[count]=temp.get(count); returnval; } publicvoidclosuer_innal(intitem[],ArrayList { if(item.length==2) return; inti; intp[]; for(i=0;i =-1;i++) ; if(item.length-1==i) return; if(item[i+1]<1000) { p=getStartWith(item[i+1]); for(i=0;i if(pos.indexOf(p[i])==-1) { pos.add(p[i]); closuer_innal(producer.get(p[i]),pos); } } return; } publicArrayList { ArrayList ArrayList closuer_innal(a,pos); for(inti=0;i { val.add(copy(producer.get(pos.get(i)))); } returnval; } publicArrayList { intindex1=0,index2=0,index3,bl,index=0; ints1[],s2[]; ArrayList ArrayList temp1=copy(a); s1=temp1.get(index1); if(s1==null) returnnull; while(s1[index2]! =-1) { index2++; } if(s1.length==index2) returnnull; index2++; for(index3=0;index3 { s1=copy(temp1.get(index3)); if(s1.length continue; if(s1[index2]==x&&indexof(temp2,s1)<0) { bl=s1[index2-1]; s1[index2-1]=s1[index2]; s1[index2]=bl;//-1往后移位 temp2.add(copy(s1)); } } bl=temp2.size(); for(index=0;index { s1=copy(temp2.get(index)); temp1=closure(s1); for(index1=0;index1 { s2=temp1.get(index1); if(indexof(temp2,s2)<0) { temp2.add(s2); } } } returntemp2; } publicLR0(ArrayList { core=newArrayList Ary_c=newArrayList producer=p; } publicvoidtotal() { ArrayList cur.add(producer.get(0)); core.add(cur); inti=0; while(i { cur=core.get(i); LR0Split(cur); i++; } update(); } publicvoidLR0Split(ArrayList { ArrayList ArrayList int[]temp; int[]prod; intstart; ArrayList ArrayList intj; for(inti=0;i { tempal=closure(cur.get(i)); for(j=0;j if(indexof(handle,tempal.get(j))==-1) handle.add(tempal.get(j)); } while(! handle.isEmpty()) { prod=(int[])handle.get(0); start=getStart(prod);//返回-1之后的数,没有返回-1 if(start==-1) { handle.remove(0); continue; } result=getStartWith(start,handle);//返回handle中所有-1之后是start的产生式,并删除 repair(result);//将result中产生式-1以后的数与-1调换 /*returnval=newArrayList for(inti=0;i { temp=(int[])result.get(i); val=closure(temp); if(indexof(returnval,temp)<0); returnval.add(temp); for(intj=0;j { if(indexof(returnval,val.get(j))<0); returnval.add(val.get(j)); } }*/ if(indexof(core,result)<0) core.add(result); } } publicintgetStart(int[]prod)//返回-1之后的数,没有返回-1 { inti=0; while(prod[i]! =-1&&i i++; if(prod.length-1<=i) return-1; else returnprod[i+1]; } publicArrayList { ArrayList inti; for(i=0;i { if(isStartWith(start,handle.get(i))) { val.add(handle.get(i)); handle.remove(i); i--; } } returnval; }//返回handle中所有-1之后是start的产生式,并删除 publicbooleanisStartWith(intstart,int[]prod)//产生式-1之后是否为start,是返回1,否则返回0; { booleanstate=false; if(getStart(prod)==start) state=true; returnstate; } publicvoidrepair(ArrayList { intnum; inti,j=0; for(i=0;i { j=0; while(prod.get(i)[++j]! =-1); if(prod.get(i).length==j+1)//遇到空字符的动作 continue; num=prod.get(i)[j]; prod.get(i)[j]=prod.get(i)[j+1]; prod.get(i)[j+1]=num; } } publicvoidupdate() { ArrayList ArrayList intindex; intprod[]; for(inti=0;i { Ary_n=core.get(i); Ary_r=newArrayList for(index=0;index { prod=(int[])Ary_n.get(index); if(prod[0]==0||prod[1]! =-1) Ary_r.add(prod); } if(indexof(Ary_c,Ary_r)<0) Ary_c.add(Ary_r); } System.out.println(); } } 类: Phrase 功能: 为每个项目配备向前搜索符 输入: LR0核心项目集 输出: LALR (1)核心项目集 实现思想: LALR (1)的造核算法 publicvoidsponsor() { Queuehq; inti,j; //核心项目lnode LinkNodelnode; QNodeqnode; //核心项目的产生式 intp[]; //-2是一个特殊的标志符,也就是传播符串的标志; ints[]={-2}; calFirst=newCalFirst(producer); hq=newQueue(); //开始符号的特殊处理 VT.add("#"); I[0].search=newint[1]; I[0].search[0]=VT.indexOf("#")+1000; qnode=newQNode(0,0); hq.enq(qnode); for(i=0;i { lnode=I[i]; while(lnode! =null) { //if(lnode.search[0]==nu) item.clear(); sstr.clear(); //有自生搜索符 closuer_self(lnode.prod,s); if(item.size()>0) { for(j=0;j { qnode=update(item.get(j),sstr.get(j),hq);//修改自生搜索符,并入队 //if(qnode! =null) //hq.enq(qnode); } } lnode=lnode.next; } } while(! hq.isEmpty()) { qnode=hq.deq(); lnode=getLinkNode(I[qnode.state],qnode.item);//qnode.i状态中的第j个项目 p=lnode.prod; item.clear(); sstr.clear(); //传播传播搜索符 closuer_spread(p,lnode.search); if(item.size()>0) { for(j=0;j { qnode=update(item.get(j),lnode.search,hq);//修改传播搜索符\并入队 //if(qnode! =null) //hq.enq(qnode); } } //对每一个状态集都进行如此处理 } } //求出项目p的闭包中所有核心项目的自生搜索符 privateint[]copy(int[]a) { intval[]=newint[a.length]; for(inti=0;i val[i]=a[i]; returnval; } publicbooleanclosuer_self(intp[],int[]s) { inti; intleft=-1;//产生式左部 inttemp; int[]genrate; int[]pos; int[]new_s; //ArrayList //找到-1(.)之后的第一个符号 for(i=1;i =-1;i++) ; i++; //p为移进项目 if(i left=p[i]; //p为归约项目 else returnfalse; //p的闭包为其本身 if(left>=1000) returnfalse; //example: //01-1110032 //left=1 //s'=first(1003,2,s); i++; //项目p中left之后的符号串加上s的first集就是left-1XXX的搜索符集new_S new_s=first(p,i,s); pos=getStartWith(left); //closuer(p,pos); for(i=0;i { genrate=producer.get(pos[i]); //递归向下求解,暂时定为自生一次即截止,向下传播通过genarate的自生求解 if(genrate.length==2) continue; if(! (left==p[0])) closuer_self(genrate,s); else if(! isEqual(genrate,p)) closuer_self(genrate,s); //搜索符集是自生的 if(new_s[0]! =-2) { genrate=copy(genrate); temp=genrate[1]; genrate[1]=genrate[2]; genrate[2]=temp; item.add(genrate); sstr.add(new_s); } } returntrue; } publicvoidclosuer(intitem[],ArrayList { if(item.length==2) return; inti; intp[]; for(i=0;i =-1;i++) ; i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程 报告