编译原理实验报告FIRST集和FOLLOW集文档格式.docx
《编译原理实验报告FIRST集和FOLLOW集文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告FIRST集和FOLLOW集文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
n为止。
当一个文法中存在£
产生式时,例如,存在A-£
只有知道哪些符号可以合法地出现在非终结符A之后,才能知道是否选择Af£
产生式。
这些合法地出现在非终结符A之后的符号组成的集合被称为FOLLOW集合。
下面我们给出文法的FOLLOW集的定义。
设文法G|S]=(Vn,Vr,P,S),贝I」
FOLLOW(A)={a|S=>
...AaaevT}o
若S=>
・・・A,#eFOLLOW(A)o
由定义可以看出,FOLLOW(A)是指在文法G[S]的所有句型中,紧跟在非终结符A后的终结符号的集合。
FOLLOW集可按下列方法求得:
(1)对于文法G[S]的开始符号S,有#eFOLLOW(S);
(2)若文法G[S]中有形如B-xAy的规则,其中x,y^V*,则FIRST(y)-{c}GFOLLOW(A);
(3)若文法G[S]中有形如B-*xA的规则,或形如B-*xAy的规则且£
丘FIRST(y),負中x,yev\贝0FOLLOW(B)GFOLLOW(A);
3.实验内容
计算first集合和follow集合
4.实验心得
通过上机实验我对文法符号的FIRST集和FOLLOW集有了更深刻的理解,已经熟练的掌握了求解的思想和方法,同时也锻炼了自己的动手解决问题的能力,对编程能力也有所提高。
5.实验代码与结果
#include<
iostream>
string>
algorithm>
usingnamespacestd;
用于存放每个终结符的
用于存放每个非终结符
//用于存放每个非终结
#defineMAXS50intNONE[MAXS]={0};
stringstrings;
/产生式stringVn;
//非终结符stringVt;
//终结符stringfirst[MAXS];
〃first集stringFirst[MAXS];
//的first集stringFollow[MAXS];
符的follow集intN;
//产生式个数
百匸2~d¥
u>
(00lx(uh4a_E:
d)pu£
!
t((■zbvnl匸a-EdQQMHAm卫~d)!
t
++o£
6ua一煌一~d(Mv『0HEO4
+±
ZV~0»
)」04
:
34.E
(FM1S)1>
N>
po>
H>
足N>
後//
26一」6u£
s
ca-6u£
MIS10ES
}else
{
if(Vt.find(p[i].left[j])>
100)
Vt+=p[i].left[j];
}
}for(j=0;
jv(int)p[i].right.length();
j++)
if(!
(p[i].right[j]>
='
A'
&
p[i].right[j]<
Z'
))
if(Vt.find(p[i].right[j])>
100)Vt+=p[i].right[j];
else
if(Vn.find(p[i].right[j])>
100)Vn+=p[i].right[j];
voidgetlr(STR*p,inti)
intj;
for(j=0;
jvstrings.length();
if(strings[j]=='
-'
strings[j+1]=='
'
)
p[i].left=strings・substr(0,j);
p[i].right=strings.substr(j+2,strings」ength()-j);
}
〃对每个文法符号求first集
stringLetter_First(STR*p,charch)
intt;
(Vt.find(ch)>
100))
first[Vt.find(ch)]="
ch"
;
returnfirst[Vt・find(ch)-1];
(Vn.find(ch)>
for(inti=0;
i<
N;
i++)
if(p[i].left[0]==ch)
{if(!
(Vt.find(p[i].right[O])>
1O0)){
if(First[Vn.find(ch)].find(p[i].right[0])>
1OO)
{First[Vn.find(ch)]+=p[i].right[0];
if(p[i].right[0]=='
*'
if(First[Vn.find(ch)].find('
)>
First[Vn・find(ch)]+='
(Vn.find(p[i].right[0])>
if(p[i].right・length()==1)
stringff;
ff=Letter_First(p,p[i]・right[0]);
for(inti_i=0;
i_ivff・length();
i_i++){
if(First[Vn.find(ch)].find(ff[i_i])>
First[Vn.find(ch)]+=ff[i_i];
for(int
j=0;
jvp[i].right」ength();
stringTT;
TT=Letter_First(p,p[i]・right[j]);
(TT.find('
100)&
(j+1)vp[i].right.1ength())
sort(TT・begin(),TT.end());
stringtt;
t=1;
t<
TT.length();
t++)
tt+=TT[t];
TT=tt;
tt="
"
for(t=0;
if(First[Vn.find(ch)].find(TT[t])>
First[Vn.find(ch)]+=TT[t];
{for(t=0;
TT.length();
t++){
break;
returnFirst[Vn.find(ch)];
//求每个非终结符的Follow集
stringLetter_Follow(STR*p,charch){
intt,k;
NONE[Vn.find(ch)]++;
if(NONE[Vn.find(ch)]==2){
NONE[Vn.find(ch)]=0;
returnFollow[Vn.find(ch)];
for(intj=0;
j<
p[i].right.length();
j++){
if(p[i].right[j]==ch)
if(j+1==p[i].right・length())
stringgg;
gg=Letter_Follow(p,p[i]」eft[0]);
NONE[Vn.find(p[i].left[0])]=0;
for(intk=0;
kvgg.length();
k++){
if(Follow[Vn.find(ch)].find(gg[k])>
Follow[Vn.find(ch)]+=gg[k];
stringFF;
jj=j+1;
jjvp[i].right.length();
jj++)
TT=Letter_First(p,p[i]・right[jj]);
(TT.find('
100)&
(jj+1)<
p[i].right.1ength())
TT・length();
if(FF.find(TT[t])>
100&
TT[t]!
FF+=TT[t];
if(FF.find(TT[t])>
{FF+=TT[t];
}break;
if(FF.find('
for(k=0;
k<
FF.length();
k++)
if(Follow[Vn.find(ch)].find(FF[k])>
Follow[Vn.find(ch)]+=FF[k];
{for(k=0;
if((Follow[Vn.find(ch)].find(FF[k])>
FF[k]!
Follow[Vn.find(ch)]+=FF[k];
stringdd;
dd=Letter_Follow(p,p[i].left[0]);
NONE[Vn.find(p[i].1eft[0])]=0;
for(k=0;
kvdd・length();
if(Follow[Vn.find(ch)].find(dd[k])>
Follow[Vn.find(ch)]+=dd[k];
returnFollow[Vn.find(ch)];
voidresult()
coutvv"
\n该文法不是LL
(1)型文法"
vvendl;
〃主函数
intmain()
inti,j,k;
COUtVV"
请输入产生式总数:
cin»
\n请输入各产生式(*代表空):
STR*p=newSTR[MAXS];
for(i=0;
cin>
strings;
getlr(p,i);
VNVT(p);
coutvvendl;
\n==========================
==============="
非终结符
vv"
\t"
FIRST"
\t\t"
FOLLOW"
vve
ndl;
Vn」ength();
"
vvVn[i]vv"
\t\t{"
stringpp;
pp=Letter_First(p,Vn[i]);
j+lvpp・length();
coutvvpp[j]vv"
"
coutvvpp[pp.length()-1]vv"
}"
Follow[0]+='
#'
{"
stringppp;
ppp=Letter_Follow(p,Vn[i]);
k+lvppp.length();
coutvvppp[k]vv"
coutvvppp[ppp.length()-1]vv"
}result();
cout«
\n
return0;
幘输入各产生式(刈弋表空):
K->
AB
E->
bG
fl->
fi->
b
B->
aD
C->
AD
h
D->
aS
D->
c
非终结符
FIRST
FOLLOU
£
<
br*,a>
A
*.b>
B
*,a>
#>
C
b,a,c>
D
ApC>