语法分析程序
输入一个语法句子,对其进行语法分析。 问题点数:20、回复次数:2Top
1 楼doer_ljy(可战)回复于 2002-06-23 21:23:53 得分 0
不会吧?
这个好像是很难有,我也想知道!
要有什么正则什么的吧!Top
2 楼steedhorse(晨星)回复于 2002-06-23 21:28:43 得分 0
语法规则是什么,意大利语?Top
3 楼qyw728(qiao)回复于 2002-06-29 15:53:16 得分 20
语法分析程序()
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
#include<stdlib.h>
char a[10][20],c[20],d[10][20],f[10][20];
int b[20][20],e[10][20],g[10][20],zh[10][2];
int i,j,k,l,m,n,u,v;
char ch[50],ck[50];
FILE *fp;
void get_wf()
{ int bool;
printf("请输入算符优先文法(增广文法):\n");
i=0;
gets(a[i]);
while(strlen(a[i])) gets(a[++i]);
for(i=0;strlen(a[i]);i++)
{int z,bb=1;
for(z=0;d[z][0];z++)
if(d[z][0]==a[i][0]){bb=0;break;}
if(bb)d[z][0]=f[z][0]=a[i][0];
for(j=3;a[i][j]!='\0';j++)
if(!isupper(a[i][j])){
bool=1;
for(k=1;c[k];k++)
if(c[k]==a[i][j]){bool=0;break;}
if(bool)c[k]=a[i][j];
}
}
if((fp=fopen("wfile","w"))!=NULL){fwrite(&a,10*20*sizeof(char),1,fp);
fwrite(&d,10*20*sizeof(char),1,fp);
fwrite(&f,10*20*sizeof(char),1,fp);
fwrite(&c,10*sizeof(char),1,fp);}
}
void firstvt()
{int bool=1,y=0;
for(i=0;strlen(a[i]);i++)
{for(l=0;d[l][0];l++)
if(d[l][0]==a[i][0]) break;
for(j=3;j<=4;j++)
if(!isupper(a[i][j])){bool=0;
for(k=1;c[k];k++)
if(c[k]==a[i][j]){bool=1;break;}
if(bool){
bool=1;
for(m=0;d[l][m];m++)
if(d[l][m]==k){bool=0;break;}
if(bool)d[l][m]=k; }
break;}
if(j==4){
for(n=0;d[n][0];n++)
if(d[n][0]==a[i][j-1])break;
zh[y][0]=l;zh[y++][1]=n;
}
}
for(y--;y>=0;y--)
for(m=1;d[zh[y][1]][m];m++)
{bool=1;
for(u=0;d[zh[y][0]][u];u++)
if(d[zh[y][0]][u]==d[zh[y][1]][m]){bool=0;break;}
if(bool)d[zh[y][0]][u]=d[zh[y][1]][m];}
gotoxy(20,wherey());printf("非终结符的FIRSTVT集如下:\n" );
for(i=0;d[i][0];i++)
{ gotoxy(20,wherey());
printf("%4c",d[i][0]);
for(j=1;d[i][j];j++)
printf("%4c",c[d[i][j]]);
printf("\n"); }
}
void lastvt()
{int x=0,bool=1,y=0;
for(i=0;strlen(a[i]);i++)
{for(l=0;f[l][0];l++)
if(f[l][0]==a[i][0]) break;
j=3;while(a[i][j]!='\0')j++;
x=0;
while(x<=1)
{j--;
if(!isupper(a[i][j])){bool=0;
for(k=1;c[k];k++)
if(c[k]==a[i][j]){bool=1;break;}
if(bool){
for(m=0;f[l][m];m++)
if(f[l][m]==k){bool=0;break;}
if(bool)f[l][m]=k; }
break;}
x++;
}
if(x==1){
for(n=0;f[n][0];n++)
if(f[n][0]==a[i][j+1])break;
zh[y][0]=l;zh[y++][1]=n;
}
}
for(y--;y>=0;y--)
for(m=1;f[zh[y][1]][m];m++)
{bool=1;
for(u=0;f[zh[y][0]][u];u++)
if(f[zh[y][0]][u]==f[zh[y][1]][m]){bool=0;break;}
if(bool)f[zh[y][0]][u]=f[zh[y][1]][m];}
gotoxy(20,wherey());printf("非终结符的LASTVT集如下:\n" );
for(i=0;f[i][0];i++)
{ gotoxy(20,wherey());
printf("%4c",f[i][0]);
for(j=1;f[i][j];j++)
printf("%4c",c[f[i][j]]);
printf("\n"); }
}
void rel_s()
{
for(i=0;strlen(a[i]);i++)
for(j=3;a[i][j]!='\0';j++)
if(isupper(a[i][j])){
for(l=0;d[l][0];l++)
if(d[l][0]==a[i][j]){g[i][j]=l;break;}
if(g[i][j]&&e[i][j-1])
for(m=1;d[g[i][j]][m];m++)
if(b[e[i][j-1]][d[g[i][j]][m]]){ gotoxy(20,wherey()); printf("该文法为非算符优先文法!\n");exit(0);}
else b[e[i][j-1]][d[g[i][j]][m]]=2;
}
else{
for(k=1;c[k];k++)
if(c[k]==a[i][j]){e[i][j]=k;break;}
if(e[i][j]&&e[i][j-1])
if(b[e[i][j-1]][e[i][j]]){ gotoxy(20,wherey());printf("该文法为非算符优先文法!\n");exit(0);}
else b[e[i][j-1]][e[i][j]]=1;
if(e[i][j]&&g[i][j-1]&&e[i][j-2])
if(b[e[i][j-2]][e[i][j]]){ gotoxy(20,wherey());printf("该文法为非算符优先文法!\n");exit(0);}
else b[e[i][j-2]][e[i][j]]=1;
if(e[i][j]&&g[i][j-1])
for(m=1;f[g[i][j-1]][m];m++)
if(b[f[g[i][j-1]][m]][e[i][j]]){ gotoxy(20,wherey());printf("该文法为非算符优先文法!\n");exit(0);}
else b[f[g[i][j-1]][m]][e[i][j]]=3;
}
}
void g_yue()
{char cc[10],ce[10];
int x,t=1;
gotoxy(20,wherey());printf("输入要分析的字符串:" );
gets(ch);
k=0;l=0;
while(ch[k]!='\0')k++;
ch[k]='#';ch[k+1]='\0';
m=0;ck[m]='#';
gotoxy(20,wherey());printf("分析过程如下:\n");
gotoxy(20,wherey());printf("步骤 栈 优先关系 当前符号 剩余串 动作\n");
int bl=1,p,q;
for(i=0;ch[i]!='\0';i++)
{gotoxy(20,wherey());
printf("%2d",t++);
gotoxy(27,wherey());
for(u=0;u<=m;u++)
printf("%c",ck[u]);
q=0;
for(p=i+1;ch[p]!='\0';p++)
ce[q++]=ch[p];
ce[q]='\0';
for(k=1;c[k];k++)
if(c[k]==ch[i])j=k;
n=m;
while(isupper(ck[n])) n--;
for(k=1;c[k];k++)
if(c[k]==ck[n])break;
gotoxy(37,wherey());
switch(b[k][j])
{case 1:printf(" =");break;
case 2:printf(" <");break;
case 3:printf(" >");
}
gotoxy(45,wherey());
printf("%c",ch[i]);
gotoxy(55,wherey());
printf("%s",ce);
if(b[k][j]==0){ gotoxy(20,wherey());printf("\n该字符串不是合法字符串!press any key---\n");bl=0; break;}
else if(b[k][j]<3){ck[++m]=ch[i];gotoxy(67,wherey());if(ch[i+1]!='\0')printf("移进\n");else printf("接受\n");}
else {i--; gotoxy(67,wherey()); printf("规约\n");
x=0;
do
{n--;
while(isupper(ck[n]))n--;
for(j=0;c[j];j++)
if(c[j]==ck[n])break;
}while(b[j][k]==1);
u=n;
while(m>u)cc[x++]=ck[++u];
m=n;
for(u=0;strlen(a[u]);u++)
{x=1;
for(v=3;a[u][v]!='\0';v++)
if(!isupper(a[u][v])&&a[u][v]!=cc[v-3])x=0;
if(x){ck[++m]=a[u][0];l=0;break; }
}
}
} gotoxy(20,wherey());
if(bl) printf("successful!press any key---");
_setcursortype(_NOCURSOR);
while(!kbhit());
}
void main()
{for(i=0;i<10;i++)
for(j=0;j<20;j++)
d[i][j]=e[i][j]=f[i][j]=g[i][j]=0;
for(i=0;i<20;i++)
for(j=0;j<20;j++)
b[i][j]=0;
for(i=0;i<10;i++)
c[i]=0;
textbackground(BLUE);
clrscr();
printf("*****************************语法分析器*****************************************\n");
gotoxy(20,5);
printf("要使用新文法?(y/n):");
if(getchar()=='y') {scanf("%c");get_wf();}
else{scanf("%c");
if((fp=fopen("wfile","r"))!=NULL){fread(&a,10*20*sizeof(char),1,fp);
fread(&d,10*20*sizeof(char),1,fp);
fread(&f,10*20*sizeof(char),1,fp);
fread(&c,10*sizeof(char),1,fp);}
gotoxy(20,wherey());printf("您现在使用的文法为:\n");
for(i=0;strlen(a[i]);i++)
{ gotoxy(20,wherey());
for(j=0;a[i][j]!='\0';j++)
printf("%2c",a[i][j]);
printf("\n");
}
}
for(i=0;strlen(a[i]);i++)
{for(j=1;a[i][j]!=0;j++)
if(isupper(a[i][j])&&isupper(a[i][j-1])){ gotoxy(20,wherey());printf("该文法为非算符文法!\n"); exit(0);}
if(j<=3){ gotoxy(20,wherey());printf("该文法为非算符优先文法!\n"); exit(0);}
}
firstvt();
lastvt();
k=1;
while(c[k])k++;
rel_s();
gotoxy(20,wherey());printf("所求关系矩阵如下:\n");
gotoxy(22,wherey());
for(i=1;i<=k;i++)
printf("%2c",c[i]);
printf("\n");
for(i=1;i<=k;i++)
{ gotoxy(20,wherey());
printf("%2c",c[i]);
for(j=1;j<=k;j++)
switch(b[i][j])
{case 0:printf(" ");break;
case 1:printf(" =");break;
case 2:printf(" <");break;
case 3:printf(" >");
}
printf("\n");
}
g_yue();
}
Top




