安工大王森玉编译原理实验报告文档格式.docx

上传人:b****6 文档编号:22055888 上传时间:2023-02-02 格式:DOCX 页数:25 大小:104.90KB
下载 相关 举报
安工大王森玉编译原理实验报告文档格式.docx_第1页
第1页 / 共25页
安工大王森玉编译原理实验报告文档格式.docx_第2页
第2页 / 共25页
安工大王森玉编译原理实验报告文档格式.docx_第3页
第3页 / 共25页
安工大王森玉编译原理实验报告文档格式.docx_第4页
第4页 / 共25页
安工大王森玉编译原理实验报告文档格式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

安工大王森玉编译原理实验报告文档格式.docx

《安工大王森玉编译原理实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《安工大王森玉编译原理实验报告文档格式.docx(25页珍藏版)》请在冰豆网上搜索。

安工大王森玉编译原理实验报告文档格式.docx

能推出ε,0:

不能,初值:

-1

intnum;

charfirst[MAX];

ints;

charfollow[MAX];

intl;

}l[MAX];

//对输入的格式进行控制,并校验输入是否符合格式

inthandle(chara[])

{

intlen,i=0,j,k;

len=strlen(a);

while(a[i]!

=10)

{

if(a[i]=='

~'

return2;

if(('

'

==a[i])||(9==a[i]))

{

i++;

continue;

}

if((a[i]>

='

A'

)&

&

(a[i]<

Z'

))

if((a[i+1]!

-'

)||(a[i+2]!

>

'

{

printf("

产生式格式错误\n"

);

return-1;

}

else

j=i;

k=0;

while((a[j]!

(a[j]!

=9)&

=10))

{

if(a[j]=='

|'

{

css[count][k]='

\0'

;

count++;

if((a[j+1]=='

)||(a[j]==9)||(a[j]=='

)||(a[j]==10))

{

printf("

return0;

}

css[count][0]=a[i];

css[count][1]=a[i+1];

css[count][2]=a[i+2];

k=3;

j++;

continue;

}

css[count][k]=a[j];

k++;

j++;

}

css[count][k]='

i=j;

count++;

else

printf("

return-1;

}

return0;

}

//从键盘获得输入

intinput()

chara[MAX*MAX];

intv;

printf("

输入产生式,产生式之间以空格回车或Tab键分隔,并以~键结束.\n"

用#表示空符号ε,非终结符用大写字母表示,其他字符表示终结符\n"

while

(1)

fgets(a,MAX*MAX,stdin);

v=handle(a);

if(v==-1)

if(v==2)

return0;

//求出能推出ε的非终结符

voidseekEmpty()

inti,j,k,t;

intflag=0,flag2=0;

intlen,c;

chara[MAX][MAX],ch;

for(i=0;

i<

count;

i++)

strcpy(a[i],css[i]);

//求出含有的非终结符的个数,并把各终结符保存起来

for(j=0;

j<

cnt;

j++)

if(l[j].ch==a[i][0])

l[j].num++;

flag=1;

break;

flag=0;

if((!

cnt)||(!

flag))

l[cnt].ch=a[i][0];

l[cnt].flag=-1;

l[cnt].num=1;

l[cnt].s=0;

l[cnt].l=0;

cnt++;

flag=1;

c=count;

while(c)

for(i=0;

c;

//如果该终结符推出ε,从a[]中删除所有带有该终结符的产生式

if(a[i][3]=='

#'

ch=a[i][0];

for(j=0;

if(ch==a[j][0])

if(j!

=c-1)

for(k=j;

k<

c-1;

k++)

strcpy(a[k],a[k+1]);

c--;

j--;

else

if(ch==l[j].ch)

l[j].flag=1;

break;

i--;

continue;

len=strlen(a[i]);

for(j=3;

len;

//当该产生式右边含有非终结符时从a[]中删除该条记录

if((a[i][j]<

)||(a[i][j]>

flag2=1;

break;

if(flag2)

for(k=0;

if(a[i][0]==l[k].ch)

l[k].num--;

if(l[k].num==0)

l[k].flag=0;

if(i!

for(k=i;

strcpy(a[k],a[k+1]);

c--;

flag2=0;

//如果产生式右边为非终结符看看该终结符能不能推出ε

if((a[i][j]>

(a[i][j]<

for(k=0;

if(a[i][j]==l[k].ch)

if(l[k].flag==0)

{

flag2=1;

break;

}

elseif(l[k].flag==1)

for(t=j;

t<

len-1;

t++)

a[i][t]=a[i][t+1];

a[i][len-1]='

j--;

len--;

break;

if(flag2)

if(ch==l[k].ch)

l[k].flag=1;

//求每个非终结符的First集合

voidseekFirstVn()

inti,j,k,t,t1,t2,c,item;

intlen,s,flag=0,flag2=0,fchange;

chara[MAX][MAX],ch[MAX];

fchange=0;

//右部为ε,将ε并入到左部的First中

//从当前列表a[]中删除

for(j=i;

strcpy(a[j],a[j+1]);

//产生式右边符号为终结符时,将该终结符并入到左部的First集合中

if(a[i][0]==l[k].ch)

for(t=0;

l[k].s;

if(a[i][j]==l[k].first[t])

{

flag=1;

break;

}

if(!

flag)

l[k].first[l[k].s]=a[i][j];

l[k].s++;

l[k].first[l[k].s]='

fchange=1;

flag=0;

//从a[][]中删除该条产生式

if(i!

for(k=i;

strcpy(a[k],a[k+1]);

c--;

i--;

//产生式右边符号为非终结符时

elseif((a[i][j]>

/*将该非终结符的FIRST集合除去ε并入到当前

非终结符的FIRST集合中*/

if(a[i][0]==l[t].ch)

for(t1=0;

t1<

t1++)

{

for(t2=0;

t2<

l[t].s;

t2++)

{

if(l[k].first[t1]==l[t].first[t2])

{

break;

}

}

if((t2==l[t].s)&

(l[k].first[t1])!

fchange=1;

l[t].first[l[t].s]=l[k].first[t1];

l[t].s++;

l[t].first[l[t].s]='

}

if(l[k].flag)

else

if(!

fchange)

for(i=0;

if(l[i].flag)

l[i].first[l[i].s]='

l[i].s++;

FIRST(%c):

%s\n"

l[i].ch,l[i].first);

\n"

break;

intmain()

inti;

if(input()==-1)

return-1;

seekEmpty();

seekFirstVn();

实验内容二:

部分源码:

//求产生式右部的First集合

voidseekFirstRight()

structRight{

chara[MAX];

charfirst[MAX];

ints;

}r[MAX];

intcnt=0,len,len1,flag=0;

if(!

strcmp(css[i]+3,r[j].a))

if(flag)

flag=0;

strcpy(r[j].a,css[i]+3);

r[j].s=0;

cnt++;

len=strlen(r[i].a);

//遇到终结符

if(r[i].a[j]=='

r[i].first[r[i].s]='

r[i].s++;

elseif((r[i].a[j]<

)||(r[i].a[j]>

r[i].first[r[i].s]=r[i].a[j];

if(r[i].a[j]==l[k].ch)

len1=strlen(l[k].first);

for(t=0;

len1;

if(l[k].first[t]!

r[i].first[r[i].s]=l[k].first[t];

r[i].s++;

r[i].first[r[i].s]='

if(l[k].flag)

if(j==len-1)

r[i].first[r[i].s]='

r[i].s++;

continue;

else

printf("

FIRST(%s):

r[i].a,r[i].first);

seekFirstRight();

//seekFollow();

实验内容三:

测试文法:

B->

BoT|T

T->

TaF|F

F->

Nf|(B)|t|f

//求每个非终极符的Follow集合

voidseekFollow()

inti,j,k,t,t1,t2,t3,c=0;

intflag=0,len;

intfchange;

//判断一次循环是否有改动的地方

len=strlen(css[i]);

for(j=3;

if((css[i][j]>

(css[i][j]<

if(j!

=len)

strcpy(a[c],css[i]);

c++;

l[0].follow[l[0].l]='

l[0].l++;

//判断该非终结符的前一位是否为非终结符,是的话,

//将其First集合去ε后并到其前一位非终结符的Follow集合中

if((a[i][j-1]>

(a[i][j-1]<

for(k=0;

if(a[i][j-1]==l[k].ch)

for(t=0;

if(a[i][j]==l[t].ch)

for(t1=0;

if(l[t].first[t1]=='

continue;

for(t2=0;

l[k].l;

if(l[t].first[t1]==l[k].follow[t2])

break;

if(t2==l[k].l)

fchange=1;

l[k].follow[l[k].l]=l[t].first[t1];

l[k].l++;

l[k].follow[l[k].l]='

break;

t3=j;

strcpy(ch,a[i]);

while(!

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

当前位置:首页 > 工程科技 > 材料科学

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

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