error(); } else {
if(X=='#') {
if(X==w) {
printf("%8c是该文法的句子!\n",' '); } else
error(); } else {
p=location(X,Vn); q=location(w,Vt);
char *S1="null",*S2="NULL";
if(strcmp(M[p][q].m,S1)==0||strcmp(M[p][q].m,S2)==0) //查找产生式 error(); else
{
char str0[100];
strcpy(str0,M[p][q].m);
printf("%15c-->%s\n",X,str0); //显示对应的产生式 if(strcmp(str0,"$")==0) goto opt1; else {
length=strlen(str0); //逆序进栈 for(m=length-1;m>=0;m--) {
pushlink(st,str0[m]); }
goto opt1; } } } } }
int main() {
int i,k,n,r;
char Vn[100],Vt[100],select;
printf("******************************************************************\n"); printf("对任意输入LL(1)文法的分析表,判断验证字符串是否为该文法的句子 \n"); printf("并能给出分析和演示过程。 \n");
printf("******************************************************************\n"); opt2:
printf("请输入各终结符(#号表示结束 )Vt[i]:\n"); for(i=0;i<100;i++) {
scanf("%c",&Vt[i]); if(Vt[i]=='#') {
r=i; break; } }
printf("请输入非终结符个数:\n"); scanf("%d",&n); getchar();
for (i=0;i<n;i++) {
printf("请输入非终结符Vn[%d]:\n",i); scanf("%c",&Vn[i]); getchar();
printf("请输入此非终结符对应各终结符的产生式右部(null或NULL表示出错;$表示空串):\n");
for(k=0;k<=r;k++) {
scanf("%s",M[i][k].m); getchar(); } } opt3:
printf("请输入要分析的字符串,且以#结束:\n"); analyse(Vn, Vt);
printf("********************请选择***********************\n"); printf(" 1: 输入字符串 \n"); printf(" 2: 输入新分析表 \n"); printf(" 0: 退 出 \n"); printf("*************************************************\n"); opt4: cin>>select; switch(select) {
case '1': {goto opt3;break;} case '2': {goto opt2;} case '0': {break;}
default: {printf("输入错误!请重新选择:"); goto opt4; break;} }
return 0; }
运行结果:
语法分析器 源程序:
#include<string.h> #include<iostream> using namespace std; char prog[100],token[10]; char ch;
int syn,p,m=0,n,row,sum=0;
char *rwtab[20]={"dim","if","do","stop","end" ,"and","begin","bool","case","char", "false","for","int","not","or","set","then","true","until","while" };
void scaner() { for(n=0;n<9;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{ m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=21; for(n=0;n<20;n++) { if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } } else if((ch>='0'&&ch<='9')) { { sum=0; while((ch>='0'&&ch<='9')) { sum=sum*10+ch-'0'; ch=prog[p++]; } } p--; syn=7+15; if(sum>32767) syn=-1; } else switch(ch) {
case'=':syn=8+15;token[0]=ch;break; case'+':syn=9+15;token[0]=ch;break; case'*': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='*') {
syn=11+15; token[m++]=ch; } else { syn=10+15; p--; }
break;
case',':syn=12+15;token[0]=ch;break; case'(':syn=13+15;token[0]=ch;break; case')':syn=14+15;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; case'<':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=17+15; token[m++]=ch; } else if(ch=='=') { syn=16+15; token[m++]=ch; } else { syn=15+15; p--; } break;
case'>':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=19+15; token[m++]=ch; } else { syn=18+15; p--;
} break;
case':':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=21+15; token[m++]=ch; } else { syn=20+15; p--; } break;
case'/':syn=22+15;token[0]=ch;break; case'-':syn=23+15;token[0]=ch;break; case';':syn=24+15;token[0]=ch;break; default: syn=-1;break; } }