Problem Description
已知算术表达式文法G[E]:
E → E + T|T
T → T * F|F
F → ( E )|i
判断是否为LL(1)文法;如果是请编写一个递归下降LL(1)分析程序,
判断文法G所能接受的串。如果不是转换为LL(1)文法后,编写一个递归下降LL(1)分析程序。
Input 输入多行由终止符构成的算术表达式,输入EOF结束。
Output 判断每行输入的算术表达式,如果表达式在语法结构上是合法的,输出"syntax correct";否则输出"syntax error"。
Sample Input
i+ii#
i+ii+i++#
Sample Output
syntax correct
syntax error
消除左递归后的文法
E →TE1
E1→+TE1 | ε
T → FT1
T1→*F T1 | ε
F→(E)|i
C++代码实现
//
// Created by Visunf Chen on 2020-10-23.
//先消除左递归
#include "iostream"
using namespace std;
string str;
int flag=1;//默认合法
void E(string s);//1.非终结符E
void E1(string s);//2.非终结符E'
void T(string s);//3.非终结符T
void T1(string s);//4.非终结符T'
void F(string s);//非终结符F
void E(string string1){
str = string1;
T(str);
E1(str);
return;
}
void E1(string string1){
str = string1;
if (str[0]=='+'){
str = str.substr(1,str.length());
T(str);
E1(str);
}
return;
}
void T(string string1){
str = string1;
F(str);
T1(str);
return;
}
void T1(string string1){
str = string1;
if (str[0]=='*'){
str = str.substr(1,str.length());
F(str);
T1(str);
}
return;
}
void F(string string1){
str = string1;
if (str[0]=='i'){
str = str.substr(1,str.length());
}
else if (str[0]=='('){
str = str.substr(1,str.length());
E(str);
if (str[0]==')')
str = str.substr(1,str.length());
} else{
flag = 0;
}
return;
}
int main()
{
while (cin>>str&&str!="EOF"){
E(str);
if (str.length()==1 && flag==1 && str[0]=='#')cout<<"syntax correct"<<endl;
else cout<<"syntax error"<<endl;
}
return 0;
}