编译原理实验报告LL1分析法.docx
- 文档编号:6706052
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:12
- 大小:16.18KB
编译原理实验报告LL1分析法.docx
《编译原理实验报告LL1分析法.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告LL1分析法.docx(12页珍藏版)》请在冰豆网上搜索。
编译原理实验报告LL1分析法
编译原理实验报告LL
(1)分析法
编译原理实验报告LL
(1)分析法
河南工业大学实验报告
课程编译原理实验名称实验二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#。
输出过程如下:
步骤分析栈剩余输入串所用产生式
1Ei+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;iif(first.find(w[i])>first.length())
first+=w[i];
}
voidedge:
:
newfollow(stringw)
{
inti;
for(i=0;iif(follow.find(w[i])>follow.length()&&w[i]!
='@')
follow+=w[i];
}
voidedge:
:
newselect(stringw)
{
inti;
for(i=0;iif(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;iif(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(ifor(j=0;jif(n[j].getlf().find(ni.getrg()[i])==0)
{
if(nodE.find(ni.getrg()[i+1])for(k=0;kif(n[k].getlf().find(ni.getrg()[i+1])==0)
{
n[j].newfollow(n[k].getfirst());
if(n[k].getfirst().find("@")}
}
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;jif(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;
coutfor(i=0;i{
cout}
cout}
//连续输出符号
voidoutfu(inta,stringc)
{
inti;
for(i=0;icout}
//输出预测分析表
voidoutgraph(edge*n,string(*yc)[50])
{
inti,j,k;
boolflag;
for(i=0;i{
if(EnodE[i]!
='@')
下页编译原理实验报告LL
(1)分析法
{
outfu(10,"
");
cout}
}
outfu(10,"
");
coutintx;
for(i=0;i{
outfu(4,"
");
coutoutfu(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,"
");
coutoutfu(26-chuan.length()-fenxi.length(),"
");
coutoutfu(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);
coutif(pipei(chuan,fenxi,yc,b))
return1;
else
return0;
}
else
return0;
}
else
{
if(ch=='#')
{
if(ch==a)
{
coutreturn1;
}
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;
inti,j,k;
boolflag=0;
coutcin>>SUm;
coutn=newedge[SUm];
for(i=0;iif(nodE.find(str[j])>nodE.length()&&EnodE.find(str[j])>EnodE.length())EnodE+=str[j];
}//计算first集合for(i=0;i}//outfu(10,"~*~");coutfor(i=0;ibreak;
}}if(n[j].getfirst().find("@")>n[j].getfirst().length()){n[i].delfirst();
break;
}}
}}//计算follow集合for(k=0;kfollow(n[i],n,i);
}for(i=0;i}}//计算select集合for(i=0;i}for(i=0;ifor(j=0;jelse{for(k=0;kbreak;
}}}}//输出
上页下页余下全文编译原理实验报告LL
(1)分析法
coutoutfu(SUm,"
");
coutoutfu(SUm,"
");
coutoutfu(5+SUm,"-*-");
coutfor(i=0;i");
coutoutfu(SUm+4,"
");
out(n[j].getfirst());
outfu(SUm+4-2*n[j].getfirst().length(),"
");
out(n[j].getfollow());
coutbreak;
}}outfu(5+SUm,"-*-");
cout";
if(flag){coutreturn;
}else{cout}//输出预测分析表coutyc=newstring[nodE.length()][50];
outgraph(n,yc);
stringchuan,fenxi,fchuan;
coutcin>>chuan;
fchuan=chuan;
fenxi="#";
fenxi+=nodE[0];
i=0;
coutcoutoutfu(7,"
");
coutoutfu(10,"
");
coutoutfu(8,"
");
coutif(pipei(chuan,fenxi,yc,i))
coutelse
cout}
截屏如下:
三.实验中的问题及心得
这次实验让我更加熟悉了LL
(1)的工作流程以及LL
(1)分析表的构造方法。
以前课堂上搞不懂的算法流程通过实验都能得到进一步的了解。
上页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告 LL1 分析