算符优先分析程序.docx
《算符优先分析程序.docx》由会员分享,可在线阅读,更多相关《算符优先分析程序.docx(18页珍藏版)》请在冰豆网上搜索。
算符优先分析程序
南华大学
实验名称:
算符优先分析程序
学 院:
计算机学院
专业班级:
本2010电气信息类03班
学 号:
20104030342
姓 名:
谢志兴
指导教师:
吴取劲
日期:
2012年6月12日
实验二算符优先分析程序
一、实验目的
调试并完成一个算符优先分析程序,加深对算符优先分析原理的理解。
二、实验要求
算符优先分析程序的功能:
输入:
所给文法的源程序字符串、待匹配字符串。
输出:
转化后的文法、每个非终结符的FIRSTVT集和LASTVT集、算符优先分析表、规约过程。
三、源程序代码:
#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
chardata[20][20];//算符优先关系
chars[100];//模拟符号栈s
charlable[20];//文法终极符集
charinput[100];//文法输入符号串
charstring[20][10];//用于输入串的分析
intk;
chara;
intj;
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);
printf("请输入文法规则:
\n");
for(i=0;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;
}
for(i=0;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("不是算符文法!
\n");
exit(-1);
}
}
}
}
for(i=0;i{
for(j=0;st[i][j]!
='\0';j++)
{
if((st[i][j]<'A'||st[i][j]>'Z')&&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;i{
printf("%c:
",st[i][0]);
for(j=0;j{
printf("%c",first[i][j+1]);
}
printf("\n");
}
printf("每个非终结符的LASTVT集为:
\n");//输出每个非终结符的LASTVT集
for(i=0;i{
printf("%c:
",st[i][0]);
for(j=0;j{
printf("%c",last[i][j+1]);
}
printf("\n");
}
printf("算符优先分析表如下:
\n");
for(i=0;lable[i]!
='\0';i++)
printf("\t%c",lable[i]);
printf("\n");
for(i=0;i{
printf("%c\t",lable[i]);
for(j=0;j{
printf("%c\t",data[i][j]);
}
printf("\n");
}
printf("请输入文法输入符号串以#结束:
");
scanf("%s",input);
deal();
}
voidtable()
{
chartext[20][10];
inti,j,k,t,l,x=0,y=0;
intm,n;
x=0;
for(i=0;i{
firstvt(st[i][0]);
lastvt(st[i][0]);
}
for(i=0;i{
text[x][y]=st[i][0];
y++;
for(j=1;st[i][j]!
='\0';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("转化后的文法为:
\n");
for(i=0;i{
printf("%s\n",text[i]);
}
for(i=0;i"后的转化文法,用于最后的规约)*/
{
string[i][0]=text[i][0];
for(j=3,l=1;text[i][j]!
='\0';j++,l++)
string[i][l]=text[i][j];
string[i][l]='\0';
}
for(i=0;i{
for(j=1;text[i][j+1]!
='\0';j++)
{
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{
if(st[k][0]==text[i][j+1])
break;
}
m=xiabiao(text[i][j]);
for(t=0;t{
n=xiabiao(first[k][t+1]);
data[m][n]='<';
}
}
if(!
zhongjie(text[i][j])&&zhongjie(text[i][j+1]))
{
for(k=0;k{
if(st[k][0]==text[i][j])
break;
}
n=xiabiao(text[i][j+1]);
for(t=0;t{
m=xiabiao(last[k][t+1]);
data[m][n]='>';
}
}
}
}
m=xiabiao('#');
for(t=0;t{
n=xiabiao(first[0][t+1]);
data[m][n]='<';
}
n=xiabiao('#');
for(t=0;t{
m=xiabiao(last[0][t+1]);
data[m][n]='>';
}
data[n][n]='=';
}
voidfirstvt(charc)//求FIRSTVT集
{
inti,j,k,m,n;
for(i=0;i{
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;j