编译原理实验报告LL1分析法.docx

上传人:b****6 文档编号:6048677 上传时间:2023-01-03 格式:DOCX 页数:17 大小:32.46KB
下载 相关 举报
编译原理实验报告LL1分析法.docx_第1页
第1页 / 共17页
编译原理实验报告LL1分析法.docx_第2页
第2页 / 共17页
编译原理实验报告LL1分析法.docx_第3页
第3页 / 共17页
编译原理实验报告LL1分析法.docx_第4页
第4页 / 共17页
编译原理实验报告LL1分析法.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

编译原理实验报告LL1分析法.docx

《编译原理实验报告LL1分析法.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告LL1分析法.docx(17页珍藏版)》请在冰豆网上搜索。

编译原理实验报告LL1分析法.docx

编译原理实验报告LL1分析法

河南工业大学实验报告

课程编译原理实验名称实验二LL

(1)分析法

实验目的

1.掌握LL

(1)分析法的基本原理;

2.掌握LL

(1)分析表的构造方法;

3.掌握LL

(1)驱动程序的构造方法。

一.实验内容及要求

根据某一文法编制调试LL

(1)分析程序,以便对任意输入的符号串进行分析。

本次实验的目的主要是加深对预测分析LL

(1)分析法的理解。

对下列文法,用LL

(1)分析法对任意输入的符号串进行分析:

(1)E->TG

(2)G->+TG

(3)G->ε

(4)T->FS

(5)S->*FS

(6)S->ε

(7)F->(E)

(8)F->i

程序输入一以#结束的符号串(包括+*()i#),如:

i+i*i#。

输出过程如下:

步骤

分析栈

剩余输入串

所用产生式

1

E

i+i*i#

E->TG

...

...

...

...

 

二.实验过程及结果

代码如下:

#include

#include"edge.h"

usingnamespacestd;

edge:

:

edge()

{

cin>>left>>right;

rlen=right.length();

if(NODE.find(left)>NODE.length())

NODE+=left;

}

stringedge:

:

getlf()

{

returnleft;

}

stringedge:

:

getrg()

{

returnright;

}

stringedge:

:

getfirst()

{

returnfirst;

}

stringedge:

:

getfollow()

{

returnfollow;

}

stringedge:

:

getselect()

{

returnselect;

}

stringedge:

:

getro()

{

stringstr;

str+=right[0];

returnstr;

}

intedge:

:

getrlen()

{

returnright.length();

}

voidedge:

:

newfirst(stringw)

{

inti;

for(i=0;i

if(first.find(w[i])>first.length())

first+=w[i];

}

voidedge:

:

newfollow(stringw)

{

inti;

for(i=0;i

if(follow.find(w[i])>follow.length()&&w[i]!

='@')

follow+=w[i];

}

voidedge:

:

newselect(stringw)

{

inti;

for(i=0;i

if(select.find(w[i])>select.length()&&w[i]!

='@')

select+=w[i];

}

voidedge:

:

delfirst()

{

inti=first.find('@');

first.erase(i,1);

}

intSUM;

stringNODE,ENODE;

//计算first

voidfirst(edgeni,edge*n,intx)

{

inti,j;

for(j=0;j

{

if(ni.getlf()==n[j].getlf())

{

if(NODE.find(n[j].getro())

{

for(i=0;i

if(n[i].getlf()==n[j].getro())

first(n[i],n,x);

}

else

n[x].newfirst(n[j].getro());

}

}

}

//计算follow

voidfollow(edgeni,edge*n,intx)

{

inti,j,k,s;

stringstr;

for(i=0;i

{

s=NODE.find(ni.getrg()[i]);

if(s-1)//是非终结符

if(i

for(j=0;j

if(n[j].getlf().find(ni.getrg()[i])==0)

{

if(NODE.find(ni.getrg()[i+1])

{

for(k=0;k

if(n[k].getlf().find(ni.getrg()[i+1])==0)

{

n[j].newfollow(n[k].getfirst());

if(n[k].getfirst().find("@")

n[j].newfollow(ni.getfollow());

}

}

else

{

str.erase();

str+=ni.getrg()[i+1];

n[j].newfollow(str);

}

}

}

}

//计算select

voidselect(edge&ni,edge*n)

{

inti,j;

if(ENODE.find(ni.getro())

{

ni.newselect(ni.getro());

if(ni.getro()=="@")

ni.newselect(ni.getfollow());

}

else

for(i=0;i

{

for(j=0;j

if(ni.getrg()[i]==n[j].getlf()[0])

{

ni.newselect(n[j].getfirst());

if(n[j].getfirst().find('@')>n[j].getfirst().length())

return;

}

}

}

//输出集合

voidout(stringp)

{

inti;

if(p.length()==0)

return;

cout<<"{";

for(i=0;i

{

cout<

}

cout<

}

//连续输出符号

voidoutfu(inta,stringc)

{

inti;

for(i=0;i

cout<

}

 

//输出预测分析表

voidoutgraph(edge*n,string(*yc)[50])

{

inti,j,k;

boolflag;

for(i=0;i

{

if(ENODE[i]!

='@')

{

outfu(10,"");

cout<

}

}

outfu(10,"");

cout<<"#"<

intx;

for(i=0;i

{

outfu(4,"");

cout<

outfu(5,"");

for(k=0;k

{

flag=1;

for(j=0;j

{

if(NODE[i]==n[j].getlf()[0])

{

x=n[j].getselect().find(ENODE[k]);

if(x-1)

{

cout<<"->"<

yc[i][k]=n[j].getrg();

outfu(9-n[j].getrlen(),"");

flag=0;

}

x=n[j].getselect().find('#');

if(k==ENODE.length()-1&&x-1)

{

cout<<"->"<

yc[i][j]=n[j].getrg();

}

}

}

if(flag&&ENODE[k]!

='@')

outfu(11,"");

}

cout<

}

}

//分析符号串

intpipei(string&chuan,string&fenxi,string(*yc)[50],int&b)

{

charch,a;

intx,i,j,k;

b++;

cout<

if(b>9)

outfu(8,"");

else

outfu(9,"");

cout<

outfu(26-chuan.length()-fenxi.length(),"");

cout<

outfu(10,"");

a=chuan[0];

ch=fenxi[fenxi.length()-1];

x=ENODE.find(ch);

if(x-1)

{

if(ch==a)

{

fenxi.erase(fenxi.length()-1,1);

chuan.erase(0,1);

cout<<"'"<

if(pipei(chuan,fenxi,yc,b))

return1;

else

return0;

}

else

return0;

}

else

{

if(ch=='#')

{

if(ch==a)

{

cout<<"分析成功"<

return1;

}

else

return0;

}

else

if(ch=='@')

{

fenxi.erase(fenxi.length()-1,1);

if(pipei(chuan,fenxi,yc,b))

return1;

else

return0;

}

else

{

i=NODE.find(ch);

if(a=='#')

{

x=ENODE.find('@');

if(x-1)

j=ENODE.length()-1;

else

j=ENODE.length();

}

else

j=ENODE.find(a);

if(yc[i][j].length())

{

cout<"<

fenxi.erase(fenxi.length()-1,1);

for(k=yc[i][j].length()-1;k>-1;k--)

if(yc[i][j][k]!

='@')

fenxi+=yc[i][j][k];

if(pipei(chuan,fenxi,yc,b))

return1;

else

return0;

}

else

return0;

}

}

}

 

voidmain()

{

edge*n;

stringstr,(*yc)[50];

inti,j,k;

boolflag=0;

cout<<"请输入上下文无关文法的总规则数:

"<

cin>>SUM;

cout<<"请输入具体规则(格式:

左部右部,@为空):

"<

n=newedge[SUM];

for(i=0;i

for(j=0;j

{

str=n[i].getrg();

if(NODE.find(str[j])>NODE.length()&&ENODE.find(str[j])>ENODE.length())

ENODE+=str[j];

}

//计算first集合

for(i=0;i

{

first(n[i],n,i);

}

//outfu(10,"~*~");cout<

for(i=0;i

if(n[i].getfirst().find("@")

{

if(NODE.find(n[i].getro())

{

for(k=1;k

{

if(NODE.find(n[i].getrg()[k])

{

for(j=0;j

{

if(n[i].getrg()[k]==n[j].getlf()[0])

{

n[i].newfirst(n[j].getfirst());

break;

}

}

if(n[j].getfirst().find("@")>n[j].getfirst().length())

{

n[i].delfirst();

break;

}

}

}

}

}

//计算follow集合

for(k=0;k

{

for(i=0;i

{

if(n[i].getlf()==n[0].getlf())

n[i].newfollow("#");

follow(n[i],n,i);

}

for(i=0;i

{

for(j=0;j

if(n[j].getrg().find(n[i].getlf())==n[j].getrlen()-1)

n[i].newfollow(n[j].getfollow());

}

}

//计算select集合

for(i=0;i

{

select(n[i],n);

}

for(i=0;i

{

str.erase();

for(j=0;j

if(n[j].getlf()[0]==NODE[i])

{

if(!

str.length())

str=n[j].getselect();

else

{

for(k=0;k

if(str.find(n[j].getselect()[k])

{

flag=1;

break;

}

}

}

}

//输出

cout<

outfu(SUM,"");

cout<<"First";

outfu(SUM,"");

cout<<"Follow"<

outfu(5+SUM,"-*-");

cout<

for(i=0;i

{

for(j=0;j

if(NODE[i]==n[j].getlf()[0])

{

outfu(3,"");

cout<

outfu(SUM+4,"");

out(n[j].getfirst());

outfu(SUM+4-2*n[j].getfirst().length(),"");

out(n[j].getfollow());

cout<

break;

}

}

outfu(5+SUM,"-*-");

cout<

";

if(flag)

{

cout<<"该文法不是LL

(1)文法!

"<

return;

}

else

{

cout<<"该文法是LL

(1)文法!

"<

}

//输出预测分析表

cout<

"<

yc=newstring[NODE.length()][50];

outgraph(n,yc);

stringchuan,fenxi,fchuan;

cout<

";

cin>>chuan;

fchuan=chuan;

fenxi="#";

fenxi+=NODE[0];

i=0;

cout<

"<

cout<<"步骤";

outfu(7,"");

cout<<"分析栈";

outfu(10,"");

cout<<"剩余输入串";

outfu(8,"");

cout<<"推导所用产生式或匹配";

if(pipei(chuan,fenxi,yc,i))

cout<

"<

else

cout<

"<

}

截屏如下:

三.实验中的问题及心得

这次实验让我更加熟悉了LL

(1)的工作流程以及LL

(1)分析表的构造方法。

以前课堂上搞不懂的算法流程通过实验都能得到进一步的了解。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1