编译原理实验报告LL1分析法.docx
- 文档编号:12871491
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:12
- 大小:15.91KB
编译原理实验报告LL1分析法.docx
《编译原理实验报告LL1分析法.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告LL1分析法.docx(12页珍藏版)》请在冰豆网上搜索。
编译原理实验报告LL1分析法
编译原理实验报告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;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++;cout9)outfu(8,"");elseoutfu(9,"");cout-1){if(ch==a){fenxi.erase(fenxi.length()-1,1);chuan.erase(0,1);cout
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"-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;
cin>>SUM;coutNODE.length()&&ENODE.find(str[j])>ENODE.length())ENODE+=str[j];}//计算first集合for(i=0;in[j].getfirst().length()){n[i].delfirst();break;}}}}}
for(k=0;k
outfu(SUM,"");cout>chuan;fchuan=chuan;fenxi="#";fenxi+=NODE[0];i=0;cout
outfu(7,"");
cout
outfu(10,"");
cout
outfu(8,"");
cout
if(pipei(chuan,fenxi,yc,i))
cout
else
cout
}
截屏如下:
三.实验中的问题及心得
这次实验让我更加熟悉了LL
(1)的工作流程以及LL
(1)分析表的构造方法。
以前课堂上搞不懂的算法流程通过实验都能得到进一步的了解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告 LL1 分析