算符优先分析程序Word文件下载.docx
《算符优先分析程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《算符优先分析程序Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
charq;
intr;
//文法规则个数
intr1;
//转化后文法规则个数
charst[10][30];
//用来存储文法规则
charfirst[10][10];
//文法非终结符FIRSTVT集
charlast[10][10];
//文法非终结符LASTVT集
intfflag[10]={0};
//标志第i个非终结符的FIRSTVT集是否已求出
intlflag[10]={0};
//标志第i个非终结符的LASTVT集是否已求出
intdeal();
//对输入串的分析
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;
}
r;
i++)//判断文法是否合法
{
for(j=0;
st[i][j]!
='
\0'
;
j++)
{
if(st[i][0]<
'
A’||st[i][0]〉’Z’)
{
printf("
不是算符文法!
\n”);
exit(-1);
}
if(st[i][j]〉=’A’&&st[i][j]〈=’Z'
)
{
if(st[i][j+1]>
=’A'
&
&st[i][j+1]〈='
Z'
{
printf("
);
}
}
}
st[i][j]!
=’\0’;
if((st[i][j]<
’A’||st[i][j]>
)&&
st[i][j]!
=’-'
st[i][j]!
=’〉’&&
|’)
lable[k++]=st[i][j];
}
lable[k]='
#’;
lable[k+1]=’\0’;
table();
printf(”每个非终结符的FIRSTVT集为:
\n”);
//输出每个非终结符的FIRSTVT集
for(i=0;
printf("
%c:
”,st[i][0]);
for(j=0;
j〈first[i][0];
printf(”%c"
first[i][j+1]);
每个非终结符的LASTVT集为:
//输出每个非终结符的LASTVT集
%c:
”,st[i][0]);
j〈last[i][0];
{
printf("
%c”,last[i][j+1]);
printf(”算符优先分析表如下:
lable[i]!
=’\0'
i++)
printf(”\t%c"
,lable[i]);
printf(”\n"
k+1;
printf(”%c\t"
,lable[i]);
j<
%c\t”,data[i][j]);
}
printf(”\n”);
请输入文法输入符号串以#结束:
scanf(”%s"
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;
st[i][j]!
if(st[i][j]=='
text[x][y]=’\0'
x++;
y=0;
text[x][y]=st[i][0];
y++;
text[x][y++]='
-’;
text[x][y++]='
〉'
else
text[x][y]=st[i][j];
y++;
text[x][y]=’\0’;
x++;
y=0;
r1=x;
printf(”转化后的文法为:
x;
i++)//输出转化后的文法规则串
printf(”%s\n”,text[i]);
i〈x;
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]=’\0’;
for(j=1;
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]!
\0’&&zhongjie(text[i][j])&
zhongjie(text[i][j+2])&&
!
zhongjie(text[i][j+1]))
m=xiabiao(text[i][j]);
n=xiabiao(text[i][j+2]);
data[m][n]='
=’;
if(zhongjie(text[i][j])&
&!
zhongjie(text[i][j+1]))
for(k=0;
k<
k++)
{
if(st[k][0]==text[i][j+1])
break;
}
m=xiabiao(text[i][j]);
for(t=0;
t<
first[k][0];
t++)
n=xiabiao(first[k][t+1]);
data[m][n]='
<
’;
if(!
zhongjie(text[i][j])&&zhongjie(text[i][j+1]))
k〈r;
if(st[k][0]==text[i][j])
n=xiabiao(text[i][j+1]);
t〈last[k][0];
m=xiabiao(last[k][t+1]);
data[m][n]='
m=xiabiao(’#’);
for(t=0;
t〈first[0][0];
n=xiabiao(first[0][t+1]);
data[m][n]='
n=xiabiao('
#’);
for(t=0;
t〈last[0][0];
m=xiabiao(last[0][t+1]);
data[m][n]='
〉’;
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;
t〈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]!
=’\0’);
first[i][n]=’\0’;
first[i][0]=——n;
fflag[i]=1;
voidlastvt(charc)//求LASTVT集
inti,j,k,m,n;
if(st[i][0]==c)
break;
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]);
for(j=0;
if(st[j][0]==st[i][m])
k〈last[j][0];
intt;
for(t=0;
{
if(last[i][t]==last[j][k+1])
last[i][n]=last[j][k+1];
n++;
}while(st[i][m]!
last[i][n]='
\0’;
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);
printf(”规约\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);
a);
out(i+1,z,input);
结束\n"
printf(”输入串符合文法的定义!
return1;
//输入串符合文法的定义
if(data[x][y]==’〈'
||data[x][y]=='
{//移进
printf(”%c”,a);
out(i+1,z,input);
移进\n”);
k++;
s[k]=a;
i++;
printf(”\nflase"
return0;
\nflase"
return0;
voidout(intj,intk,char*s)
intn=0;
inti;
for(i=j;
=k;
printf(”%c”,s[i]);
n++;
for(;
n<
15;
printf(””);
intxiabiao(charc)//求字符c在算符优先关系表中的下标
inti;
lable[i]!
if(c==lable[i])
returni;
return-1;
intzhongjie(charc)//判断字符c是否是终极符
lable[i]!
return1;
return0;
四、结果验证
给定文法:
E→E+T|T
T→T*F|F
F→(E)|i
验证输入串:
i*i+i
输出结果:
五、实验总结分析
通过此次实验,让我了解到如何设计、编制并调试算符优先分析程序,加深对算符优先分析原理的理解;
熟悉了构造算符优先分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。
另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。