设计一个给定文法和对应的FIRSTVT和LASTVT集能依据依据文法和FIRSTVT和LASTVT生成算符优先分析表Word下载.docx
《设计一个给定文法和对应的FIRSTVT和LASTVT集能依据依据文法和FIRSTVT和LASTVT生成算符优先分析表Word下载.docx》由会员分享,可在线阅读,更多相关《设计一个给定文法和对应的FIRSTVT和LASTVT集能依据依据文法和FIRSTVT和LASTVT生成算符优先分析表Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
intzhongjie(charc);
//判断字符c是否是终极符
intxiabiao(charc);
//求字符c在算符优先关系表中的下标
voidout(intj,intk,char*s);
//打印s栈
voidfirstvt(charc);
//求非终结符c的FIRSTVT集
voidlastvt(charc);
//求非终结符c的LASTVT集
voidtable();
//创建文法优先关系表
voidmain()
{
inti,j,k=0;
printf("
请输入文法规则数:
"
);
scanf("
%d"
&
r);
请输入文法规则:
\n"
for(i=0;
i<
r;
i++)
{
scanf("
%s"
st[i]);
//存储文法规则,初始化FIRSTVT集和LASTVT集*/
first[i][0]=0;
/*first[i][0]和last[i][0]分别表示st[i][0]非终极
符的FIRSTVT集和LASTVT集中元素的个数*/
last[i][0]=0;
}
i++)//判断文法是否合法
for(j=0;
st[i][j]!
='
\0'
;
j++)
{
if(st[i][0]<
'
A'
||st[i][0]>
Z'
)
{
printf("
不是算符文法!
exit(-1);
}
if(st[i][j]>
&
st[i][j]<
if(st[i][j+1]>
st[i][j+1]<
{
printf("
}
}
if((st[i][j]<
||st[i][j]>
)&
-'
>
|'
lable[k++]=st[i][j];
lable[k]='
#'
lable[k+1]='
table();
每个非终结符的FIRSTVT集为:
//输出每个非终结符的FIRSTVT集
printf("
%c:
"
st[i][0]);
j<
first[i][0];
printf("
%c"
first[i][j+1]);
每个非终结符的LASTVT集为:
//输出每个非终结符的LASTVT集
last[i][0];
last[i][j+1]);
算符优先分析表如下:
lable[i]!
i++)
\t%c"
lable[i]);
k+1;
%c\t"
data[i][j]);
请输入文法输入符号串以#结束:
input);
deal();
}
voidtable()
chartext[20][10];
inti,j,k,t,l,x=0,y=0;
intm,n;
x=0;
firstvt(st[i][0]);
lastvt(st[i][0]);
text[x][y]=st[i][0];
y++;
for(j=1;
if(st[i][j]=='
text[x][y]='
x++;
y=0;
text[x][y]=st[i][0];
y++;
text[x][y++]='
else
text[x][y]=st[i][j];
text[x][y]='
x++;
y=0;
r1=x;
转化后的文法为:
x;
i++)//输出转化后的文法规则串
%s\n"
text[i]);
i++)/*求每个终结符的推导结果(去掉"
->
后的转化文法,用于最后的规约)*/
string[i][0]=text[i][0];
for(j=3,l=1;
text[i][j]!
j++,l++)
string[i][l]=text[i][j];
string[i][l]='
text[i][j+1]!
if(zhongjie(text[i][j])&
zhongjie(text[i][j+1]))
m=xiabiao(text[i][j]);
n=xiabiao(text[i][j+1]);
data[m][n]='
if(text[i][j+2]!
zhongjie(text[i][j])&
zhongjie(text[i][j+2])&
!
n=xiabiao(text[i][j+2]);
for(k=0;
k<
k++)
if(st[k][0]==text[i][j+1])
break;
for(t=0;
t<
first[k][0];
t++)
n=xiabiao(first[k][t+1]);
data[m][n]='
<
if(!
if(st[k][0]==text[i][j])
last[k][0];
m=xiabiao(last[k][t+1]);
m=xiabiao('
for(t=0;
first[0][0];
n=xiabiao(first[0][t+1]);
data[m][n]='
n=xiabiao('
last[0][0];
m=xiabiao(last[0][t+1]);
data[n][n]='
voidfirstvt(charc)//求FIRSTVT集
inti,j,k,m,n;
if(st[i][0]==c)
break;
if(fflag[i]==0)
n=first[i][0]+1;
m=0;
do
if(m==2||st[i][m]=='
if(zhongjie(st[i][m+1]))
first[i][n]=st[i][m+1];
n++;
else
if(zhongjie(st[i][m+2]))
{
first[i][n]=st[i][m+2];
n++;
}
if(st[i][m+1]!
=c)
firstvt(st[i][m+1]);
for(j=0;
{
if(st[j][0]==st[i][m+1])
break;
}
for(k=0;
first[j][0];
intt;
for(t=0;
n;
{
if(first[i][t]==first[j][k+1])
break;
}
if(t==n)
first[i][n]=first[j][k+1];
n++;
m++;
}while(st[i][m]!
first[i][n]='
first[i][0]=--n;
fflag[i]=1;
voidlastvt(charc)//求LASTVT集
if(lflag[i]==0)
n=last[i][0]+1;
if(st[i][m+1]=='
||st[i][m+1]=='
if(zhongjie(st[i][m]))
last[i][n]=st[i][m];
if(zhongjie(st[i][m-1]))
last[i][n]=st[i][m-1];
if(st[i][m]!
lastvt(st[i][m]);
if(st[j][0]==st[i][m])
last[j][0];
if(last[i][t]==last[j][k+1])
last[i][n]=last[j][k+1];
last[i][n]='
last[i][0]=--n;
lflag[i]=1;
intdeal()
inti,j;
intx,y;
intz;
//输入串的长度
k=1;
s[k]='
//栈置初值
input[i]!
i++);
//计算输入串的长度
z=i--;
i=0;
while((a=input[i])!
if(zhongjie(s[k]))
j=k;
else
j=k-1;
x=xiabiao(s[j]);
y=xiabiao(a);
if(data[x][y]=='
out(1,k,s);
%c"
a);
out(i+1,z,input);
规约\n"
do
q=s[j];
if(zhongjie(s[j-1]))
j=j-1;
elsej=j-2;
x=xiabiao(s[j]);
y=xiabiao(q);
}while(data[x][y]!
intm,n,N;
for(m=j+1;
m<
=k;
m++)
for(N=0;
N<
r1;
N++)
for(n=1;
string[N][n]!
n++)
if(!
zhongjie(s[m])&
zhongjie(string[N][n]))
if(zhongjie(s[m+1])&
zhongjie(string[N][n+1])
s[m+1]==string[N][n+1])
s[j+1]=string[N][0];
break;
else
if(zhongjie(s[m]))
if(s[m]==string[N][n])
{
s[j+1]=string[N][0];
}
k=j+1;
if(k==2&
a=='
out(1,k,s);
out(i+1,z,input);
结束\n"
输入串符合文法的定义!
return1;
//输入串符合文法的定义
if(data[x][y]=='
||data[x][y]=='
{//移进
移进\n"
k++;
s[k]=a;
i++;
\nflase"
return0;
return0;
voidout(intj,intk,char*s)
intn=0;
inti;
for(i=j;
s[i]);
n++;
for(;
n<
15;
intxiabiao(charc)//求字符c在算符优先关系表中的下标
if(c==lable[i])
returni;
return-1;
intzhongjie(charc)//判断字符c是否是终极符
return1;