实验目
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 edgeh
using namespace std
edgeedge()
{
cin>>left>>right
rlenrightlength()
if(NODEfind(left)>NODElength())
NODE+left
}
string edgegetlf()
{
return left
}
string edgegetrg()
{
return right
}
string edgegetfirst()
{
return first
}
string edgegetfollow()
{
return follow
}
string edgegetselect()
{
return select
}
string edgegetro()
{
string str
str+right[0]
return str
}
int edgegetrlen()
{
return rightlength()
}
void edgenewfirst(string w)
{
int i
for(i0i
first+w[i]
}
void edgenewfollow(string w)
{
int i
for(i0i
follow+w[i]
}
void edgenewselect(string w)
{
int i
for(i0i
select+w[i]
}
void edgedelfirst()
{
int ifirstfind('@')
firsterase(i1)
}
int SUM
string NODEENODE
计算first
void first(edge niedge *nint x)
{
int ij
for(j0j
if(nigetlf()n[j]getlf())
{
if(NODEfind(n[j]getro())
for(i0i
first(n[i]nx)
}
else
n[x]newfirst(n[j]getro())
}
}
}
计算follow
void follow(edge niedge *nint x)
{
int ijks
string str
for(i0i
sNODEfind(nigetrg()[i])
if(s
if(i
{
if(NODEfind(nigetrg()[i+1])
for(k0k
{
n[j]newfollow(n[k]getfirst())
if(n[k]getfirst()find(@)
}
}
else
{
strerase()
str+nigetrg()[i+1]
n[j]newfollow(str)
}
}
}
}
计算select
void select(edge &niedge *n)
{
int ij
if(ENODEfind(nigetro())
ninewselect(nigetro())
if(nigetro()@)
ninewselect(nigetfollow())
}
else
for(i0i
for(j0j
{
ninewselect(n[j]getfirst())
if(n[j]getfirst()find('@')>n[j]getfirst()length())
return
}
}
}
输出集合
void out(string p)
{
int i
if(plength()0)
return
cout<<{
for(i0i
cout<
}
cout<
}
连续输出符号
void outfu(int astring c)
{
int i
for(i0i
输出预测分析表
void outgraph(edge *nstring (*yc)[50])
{
int ijk
bool flag
for(i0i
if(ENODE[i]'@')
{
outfu(10 )
cout<
}
outfu(10 )
cout<<#<
for(i0i
outfu(4 )
cout<
for(k0k
flag1
for(j0j
if(NODE[i]n[j]getlf()[0])
{
xn[j]getselect()find(ENODE[k])
if(x
{
cout<<><
outfu(9n[j]getrlen() )
flag0
}
xn[j]getselect()find('#')
if(kENODElength()1&&x
{
cout<<><
}
}
}
if(flag&&ENODE[k]'@')
outfu(11 )
}
cout<
}
分析符号串
int pipei(string &chuanstring &fenxistring (*yc)[50]int &b)
{
char cha
int xijk
b++
cout<
outfu(8 )
else
outfu(9 )
cout<
cout<
achuan[0]
chfenxi[fenxilength()1]
xENODEfind(ch)
if(x
{
if(cha)
{
fenxierase(fenxilength()11)
chuanerase(01)
cout<<'< if(pipei(chuanfenxiycb))
return 1
else
return 0
}
else
return 0
}
else
{
if(ch'#')
{
if(cha)
{
cout<<分析成功<
}
else
return 0
}
else
if(ch'@')
{
fenxierase(fenxilength()11)
if(pipei(chuanfenxiycb))
return 1
else
return 0
}
else
{
iNODEfind(ch)
if(a'#')
{
xENODEfind('@')
if(x
jENODElength()1
else
jENODElength()
}
else
jENODEfind(a)
if(yc[i][j]length())
{
cout<
for(kyc[i][j]length()1k>1k)
if(yc[i][j][k]'@')
fenxi+yc[i][j][k]
if(pipei(chuanfenxiycb))
return 1
else
return 0
}
else
return 0
}
}
}
void main()
{
edge *n
string str(*yc)[50]
int ijk
bool flag0
cout<<请输入文关文法总规数:<
cout<<请输入具体规(格式:左部 右部@空):<
for(i0i
strn[i]getrg()
if(NODEfind(str[j])>NODElength()&&ENODEfind(str[j])>ENODElength())
ENODE+str[j]
}
计算first集合
for(i0i
first(n[i]ni)
}
outfu(10~*~)cout<
if(NODEfind(n[i]getro())
for(k1k
if(NODEfind(n[i]getrg()[k])
for(j0j
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(k0k
for(i0i
if(n[i]getlf()n[0]getlf())
n[i]newfollow(#)
follow(n[i]ni)
}
for(i0i
for(j0j
n[i]newfollow(n[j]getfollow())
}
}
计算select集合
for(i0i
select(n[i]n)
}
for(i0i
strerase()
for(j0j
{
if(strlength())
strn[j]getselect()
else
{
for(k0k
flag1
break
}
}
}
}
输出
cout<
cout<
cout<
cout<
for(j0j
{
outfu(3 )
cout<
out(n[j]getfirst())
outfu(SUM+42*n[j]getfirst()length() )
out(n[j]getfollow())
cout<
}
}
outfu(5+SUM*)
cout<
{
cout<<该文法LL(1)文法<
}
else
{
cout<<该文法LL(1)文法<
}
输出预测分析表
cout<
outgraph(nyc)
string chuanfenxifchuan
cout<
fchuanchuan
fenxi#
fenxi+NODE[0]
i0
cout<
outfu(7 )
cout<<分析栈
outfu(10 )
cout<<剩余输入串
outfu(8 )
cout<<推导产生式匹配
if(pipei(chuanfenxiyci))
cout<
cout<
截屏:
三 实验中问题心
次实验更加熟悉LL(1)工作流程LL(1)分析表构造方法前课堂搞懂算法流程通实验进步解
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档