根据编译原理 实验3 递归下降语法分析程序设计_/*构造递归关系及子程序*/_牛不才的博客-CSDN博客提供的代码改编完成的课后习题,更改了入口错误,模糊匹配的错误,代码较为简洁,如还有错误请多指教。
#include<stdio.h>
#include<cstring>
#include <stdlib.h>
char str[10];
int index=0;
void E(); //E->TX;
void X(); //X->+E | e
void T(); //T->FY
void Y(); //Y->T | e
void F(); //F->PZ
void Z(); //Z->*Z |e
void P(); //P->(E) | a | b| ^
int main()
{
while(1){
int len;
int m=1;
//printf("请输入要测试的次数:");
//scanf("%d",&m);
while(m--)
{
printf("请输入算数表达式:");
scanf("%s",str);
len=strlen(str);
printf("长度是:%d%n",len);
str[len]='#';
str[len+1]='\0';
E();
if(index==len)printf("正确语句!\n");
else printf("\n分析失败!\n");
strcpy(str,"");
index=0;
}
}
return 0;
}
void E()
{
T();
X();
}
void X()
{
if(str[index]=='+')
{
index++;
E();
}
}
void T()
{
F();
Y();
}
void Y()
{
if(str[index]=='#');
else if(str[index]=='('||str[index]=='a'||str[index]=='b'||str[index]=='^')
T();
}
void F()
{
P();
Z();
}
void Z()
{
if(str[index]=='*')
{
index++;
Z();
}
}
void P()
{
if(str[index]=='^')
index++;
else if(str[index]=='a')
index++;
else if(str[index]=='b')
index++;
else if (str[index]=='(')
{
index++;
E();
if(str[index]==')')
{
index++;
}else{
printf("\n分析失败!\n");
exit (0);
}
}
else{
printf("分析失败!\n");
exit(0);
}
}