概述
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;
}
最后
以上就是柔弱奇迹为你收集整理的【编译原理11】递归下降法分析算术表达式Problem Description的全部内容,希望文章能够帮你解决【编译原理11】递归下降法分析算术表达式Problem Description所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复