说明:本实验参照教材第126页例 4.1的文法为其构造递归下降识别程序。题目如下:
对于文法G4.2[E]:
E::=E+T|T T::=T*F|F F::=(E)|i
首先确定该文法存在左递归,消去之后同时也就消去了回溯性之后的等价文法〖G4.2〗^’ [E]:
E::=TE^’ E’::=+TE’|ε T::=FT^’ T’::=*FT’|ε F:;=(E)|i
二 实验说明
拿到一文法之后应该首先判断是否具有文法左递归和规则左递归,如果存在,应该首先进行消除,然后才可以进行下一步的操作
三 程序关键代码与数据结构
由于此代码比较简单,说明设置数组char str[100];用来存放用户输入的数据
int index = 0;设置变化过程中的下标。
试验完整代码:
#include "stdio.h"
char str[100];
int index = 0;
void E()
{
T();
E1();
}
void E1()
{
if(str[index]=='+')
{
index++;
T();
E1();
}
}
void T()
{
F();
T1();
}
void T1()
{
if(str[index]=='*')
{
index++;
F();
T1();
}
}
void F()
{
if(str[index]=='i')
{
index++;
}
else
{
if(str[index]=='(')
{
index++;
E();
if(str[index]==')')
{
index++;
}
else
{
Error();
}
}
else
{
Error();
}
}
}
void Error()
{
printf("错误");
exit(0);
}
int main()
{
printf("请输入句子:");
scanf("%s",&str);
E();
printf("正确语句");
}
缺陷:出错处理没有处理好,么有做到详细处理。