1、include "stdio.h"
#include "stdlib.h"
#include "iostream.h"
#include
2、ar string[20][10]; //用于输入串的分析 int k; char a; int j; char q; int r; //文法规则个数 int r1; int m,n,N;
3、 //转化后文法规则个数 char st[10][30]; //用来存储文法规则 char first[10][10]; //文法非终结符FIRSTVT集 char last[10][10]; //文法非终结符LASTVT集 int fflag[10]={0}; //标志第i个非终结符的FIRSTVT集是否已求出 int lflag[10]={0}; //标志第i个
4、非终结符的LASTVT集是否已求出 int deal(); //对输入串的分析 int zhongjie(char c); //判断字符c是否是终极符 int xiabiao(char c); //求字符c在算符优先关系表中的下标 void out(int j,int k,char *s); //打印s栈 void firstvt(char c); //求非终结符c的FIRSTVT集 void lastvt(char c);
5、 //求非终结符c的LASTVT集
void table(),shouji(),weiji(),ab(),analysis(),discrimin(),tuichu(); //创建文法优先关系表
void main()
{
int i,j;
printf("请输入文法规则数:");
scanf("%d",&r);
printf("请输入文法规则:\n");
for(i=0;i 6、ASTVT集*/
first[i][0]=0; /*first[i][0]和last[i][0]分别表示st[i][0]非终极
符的FIRSTVT集和LASTVT集中元素的个数*/
last[i][0]=0;
}
for(i=0;i 7、是算符文法!\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 8、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';
//////////////////////////////////////////////
printf("请选择:\n");
printf("1.非终结符的FIRSTVT集\n");
printf("2.非终结符的LASTVT集\n");
pri 9、ntf("3.算符优先分析表\n");
printf("4.算符优先识别\n");
printf("5.退出\n");
do
{
printf("请选择你所需的功能");
scanf("%d",&i);
switch(i)
{
case 1: shouji();break;
case 2: weiji();break;
case 3: analysis();break;
case 4: discrimin();break;
//case 5: main();break;
10、
case 5: tuichu();break;
default:ab();break;
}
}
while(i!=5);
}
void shouji()
{
int i;
table();
printf("每个非终结符的FIRSTVT集为:\n"); //输出每个非终结符的FIRSTVT集
for(i=0;i 11、
printf("\n");
}
}
void weiji()
{
int i;
table();
printf("每个非终结符的LASTVT集为:\n"); //输出每个非终结符的LASTVT集
for(i=0;i 12、////////////////////////
for(i=0;i 13、下:\n");
for(i=0;lable[i]!='\0';i++)
printf("\t%c",lable[i]);
printf("\n");
for(i=0;i 14、
table();
printf("请输入文法输入符号串以#结束:");
scanf("%s",input);
deal();
}
void table()
{
char text[20][10];
int i,j,k,t,l,x=0,y=0;
int m,n;
x=0;
for(i=0;i 15、t[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' 16、
x++;
y=0;
}
r1=x;
for(i=0;i 17、hongjie(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]='=';
18、 }
if(zhongjie(text[i][j])&&!zhongjie(text[i][j+1]))
{
for(k=0;k 19、t[i][j])&&zhongjie(text[i][j+1]))
{
for(k=0;k 20、0][0];t++)
{
n=xiabiao(first[0][t+1]);
data[m][n]='<';
}
n=xiabiao('#');
for(t=0;t 21、lag[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]! 22、c)
{
firstvt(st[i][m+1]);
for(j=0;j 23、f(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;
}
}
void lastvt(char c)
{
int i,j,k,m,n;
for(i=0;i 24、eak;
}
if(lflag[i]==0)
{
n=last[i][0]+1;
m=0;
do
{
if(st[i][m+1]=='\0'||st[i][m+1]=='|')
{
if(zhongjie(st[i][m]))
{
last[i][n]=st[i][m];
n++;
}
else
{
if(zhongjie(st[i][m-1]))
{
last[i][n]=st[i][m-1];
n++;
25、 }
if(st[i][m]!=c)
{
lastvt(st[i][m]);
for(j=0;j 26、 }
if(t==n)
{
last[i][n]=last[j][k+1];
n++;
}
}
}
}
}
m++;
}while(st[i][m]!='\0');
last[i][n]='\0';
last[i][0]=--n;
lflag[i]=1;
}
}
int deal()
{
int i,j;
int x,y;
int z;
k=1;
s[k]='#';
for( 27、i=0;input[i]!='\0';i++);
z=i--;
i=0;
while((a=input[i])!='\0')
{
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);
printf("%c",a);
out(i+1,z,input);
printf("规约\n");
do
{
q=s[j];
if 28、zhongjie(s[j-1]))
j=j-1;
else j=j-2;
x=xiabiao(s[j]);
y=xiabiao(q);
}
while(data[x][y]!='<');
int m,n,N;
for(m=j+1;m<=k;m++)
{
for(N=0;N 29、 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];
break;
30、 }
}
}
k=j+1;
if(k==2&&a=='#')
{
out(1,k,s);
printf("%c",a);
out(i+1,z,input);
printf("结束\n");
printf("输入串符合文法的定义!\n");
return 1; //输入串符合文法的定义
}
}
else if(data[x][y]=='<'||data[x][y]=='=')
{ 31、 //移进
out(1,k,s);
printf("%c",a);
out(i+1,z,input);
printf("移进\n");
k++;
s[k]=a;
i++;
}
else
{
printf("输入串不是本文法句子\n");
return 0;
}
}
printf("\nfalse\n输入串不符合文法的定义!\n");
return 0;
}
void o 32、ut(int j,int k,char *s)
{
int n=0;
int i;
for(i=j;i<=k;i++)
{
printf("%c",s[i]);
n++;
}
for(;n<15;n++)
{
printf(" ");
}
}
int xiabiao(char c) //求字符c在算符优先关系表中的下标
{
int i;
for(i=0;lable[i]!='\0';i++)
{
if(c==lable[i])
return i;
}
return -1;
}
int zhongjie(char c) //判断字符c是否是终极符
{
int i;
for(i=0;lable[i]!='\0';i++)
{
if(c==lable[i])
return 1;
}
return 0;
}
void tuichu()
{
printf("您已经退出系统\n");
}
void ab()
{
printf("系统无该选项\n");
}






