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