p126
例4.1 对于文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i,在消去左递归以及回溯性之后的等价文法为:
E::=TE’ E’::=+TE’|
F::=(E)|i(其中$代表空)
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
string str;
int index = 0;
void E(); //E->TE';
void E1(); //E'->+TE'|e
void T(); //T->FT'
void T1(); //T'->*FT'|e
void F(); //F->(E)|i
void getSymbol()
{
index++;
}
void error()
{
cout << "该符号串不是句子!" << endl;
exit(0);
}
void E()
{
T();
E1();
}
void E1()
{
if (str[index] == '+'||str[index] == '-')
{
getSymbol();
T();
E1();
}
}
void T()
{
F();
T1();
}
void T1()
{
if (str[index] == '*'||str[index] == '/')
{
getSymbol();
F();
T1();
}
}
void F()
{
if (str[index] >='a'&&str[index] <='z')
{
getSymbol();
}
else
{
if (str[index] == '(')
{
getSymbol();
E();
if (str[index] == ')')
{
getSymbol();
}
else
{
error();
}
}
else
{
error();
}
}
}
int main()
{
cout << "请输入符号串:" << endl;
cin >> str;
E();
if (str[index] == '#')
cout << "该符号串是句子!" << endl;
else
{
cout << "该符号串不是句子!" << endl;
}
}
程序已经做了相关修改,若修改为书中的程序需要将str[index] >=’a’&&str[index] <=’z’和str[index] == ‘*’||str[index] == ‘/’进行修改即可。运行结果如下: