编译原理实验报告FIRST集和FOLLOW集文档格式.docx

上传人:b****6 文档编号:20464266 上传时间:2023-01-23 格式:DOCX 页数:11 大小:17.68KB
下载 相关 举报
编译原理实验报告FIRST集和FOLLOW集文档格式.docx_第1页
第1页 / 共11页
编译原理实验报告FIRST集和FOLLOW集文档格式.docx_第2页
第2页 / 共11页
编译原理实验报告FIRST集和FOLLOW集文档格式.docx_第3页
第3页 / 共11页
编译原理实验报告FIRST集和FOLLOW集文档格式.docx_第4页
第4页 / 共11页
编译原理实验报告FIRST集和FOLLOW集文档格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

编译原理实验报告FIRST集和FOLLOW集文档格式.docx

《编译原理实验报告FIRST集和FOLLOW集文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告FIRST集和FOLLOW集文档格式.docx(11页珍藏版)》请在冰豆网上搜索。

编译原理实验报告FIRST集和FOLLOW集文档格式.docx

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>

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1