|
/*这是编译原理的一个作业题,是作语法分析的.建表是手工的,因此具有些局限性,不过可以给大家参考。*/ #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]=; /*建的语法分析表,语法如下:E::TH;H::+TH;H::空;T::FI;I::*FI;I::空;F::i;F::(E).0表示空,N表示出错*/ char sting1[5]=; char sting2[5]=; char sting3[5]=; char sting4[5]=; char sting5[5]=;/*设置字符串以供比较之用*/ loop: k=0; j=0; p=0; k=0; i=0; f=0; q2=0; v=0; t=0; printf("输入要验证的字符,只包括'+','i','*','(',')',以#号结束: "); while(b[i-1]!='#'&&b[i-1]!=' ')/*输入语句*/ { 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("识别成功 "); else printf("出错,有可能是没有以#结束,语法不正确,或者输入了其它字符 "); getchar(); }
|