/*这是编译原理的一个作业题,是作语法分析的.建表是手工的,因此具有些局限性,不过可以给大家参考。*/
#include<stdio.h>
main()
{
char b[100],a[50];
int k,j,p,i,v,t;
int q1,q2,q3,q4,q5,f;
char c[6][7]={
'0','i','+','*','(',')','#',
'E','1','N','n','1','N','N',
'H','N','2','N','N','0','0',
'T','3','N','N','3','N','N',
'I','N','0','4','N','0','0',
'F','i','N','N','5','N','N',
}; /*建的语法分析表,语法如下:E::TH;H::+TH;H::空;T::FI;I::*FI;I::空;F::i;F::(E).0表示空,N表示出错*/
char sting1[5]={'H','T'};
char sting2[5]={'H','T','+'};
char sting3[5]={'I','F'};
char sting4[5]={'I','F','*'};
char sting5[5]={')','E','('};/*设置字符串以供比较之用*/
loop:
k=0;
j=0;
p=0;
k=0;
i=0;
f=0;
q2=0;
v=0;
t=0;
printf("输入要验证的字符,只包括'+','i','*','(',')',以#号结束:\n");
while(b[i-1]!='#'&&b[i-1]!='\n')/*输入语句*/
{
scanf("%c",&b[i]);
i++;
}
for(q1=0;q1<i;q1++)
{
if(b[q1]!='i'&&b[q1]!='+'&&b[q1]!='*'&&b[q1]!='('&&b[q1]!=')'&&b[q1]!='#')
goto exit;/*看输入是否有非法字符*/
}
a[p]='#';
p++;
a[p]='E';/*从E开始推*/
loop1:
k=0;j=0;
while(c[k][0]!=a[p])
{
k++;
if(a[p]=='#')
goto loop3;
}
while(c[0][j]!=b[f]&&j<7)
j++;/*查表*/
/*以下是推导过程*/
if(c[k][j]=='1'||c[k][j]=='2'||c[k][j]=='3'||c[k][j]=='4'||c[k][j]=='5')
switch(c[k][j])/*和字符串匹配*/
{
case'1':/*和sting1匹配*/
{
q1=1;
q2=0;
p--;
while(q1>=0)
{
p++;
a[p]=sting1[q2];
q1--;
q2++;
}
}break;
case'2':/*和sting2 匹配*/
{
q1=2;
q2=0;
p--;
while(q1>=0)
{
p++;
a[p]=sting2[q2];
q1--;
q2++;
}
}break;
case'3':/*和sting3匹配*/
{
q1=1;
q2=0;
p--;
while(q1>=0)
{
p++;
a[p]=sting3[q2];
q1--;
q2++;
}
}break;
case'4':/*和sting4匹配*/
{
q1=2;
q2=0;
p--;
while(q1>=0)
{
p++;
a[p]=sting4[q2];
q1--;
q2++;
}
}break;
case'5':/*和sting5匹配*/
{
q1=2;
q2=0;
p--;
while(q1>=0)
{
p++;
a[p]=sting5[q2];
q1--;
q2++;
}
}break;
}
/*和单字符匹配*/
if(c[k][j]=='N')
goto exit;
else if(c[k][j]=='0')
{ p--;
goto loop1;}
else if(c[k][j]=='i')
a[p]=c[k][j];
if(a[p]=='i'||a[p]=='+'||a[p]=='*'||a[p]=='('||a[p]==')')
{
if(a[p]==b[f])
{p--;
f++;
goto loop1;
}
else
goto exit;
}
else if(a[p]=='E'||a[p]=='H'||a[p]=='T'||a[p]=='I'||a[p]=='F')
goto loop1;/*反复,直到结束*/
else if(a[p]=='#')
{
loop3: if(a[p]==b[f])
{ v=1;
goto exit;
}
else
goto exit;
}
else
goto exit;
exit:
if(v==1)
printf("识别成功\n");
else
printf("出错,有可能是没有以#结束,语法不正确,或者输入了其它字符\n");
getchar();
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |