【问题描述】
给定以下文法G[E]:
E→TE′
E′→+TE′| e
T →FT′
T′→*FT′| e
F → a | (E)
构建LL(1)预测分析表,并用C++编程实现LL(1)语法分析器
【输入形式】
一个句子
【输出形式】
若句子语法正确,输出"Syntax analysis is right"
若语法语法错误,输出"Error on syntax analysis"
注:输出不包括引号
【样例输入】
a+a*a
【样例输出】
Syntax analysis is right
【样例说明】
【评分标准】
根据通过的测试数据个数评分
这是编译原理课老师布置的一道实验题,看了看,大致有了想法。
首先要写出FIRST集和FOLLOW集,然后得到SELECT集,画出预测表。如图所示
```cpp
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
int t,k;
/*
E'用A来代替 T'用B来代替 e代表空字符
*/
string ll[5][6]=
{{"err","err","TA","TA","err","err"},
{"+TA","err","err","err","e","e"},
{"err","err","FB","FB","err","err"},
{"e","*FB","err","err","e","e"},
{"err","err","a","(E)","err","err"}
};
string s;
stack<char>q;
bool IsVn(char c){
if(c=='E'||c=='A'||c=='T'||c=='B'||c=='F') return true;
else return false;
}
bool IsVt(char c){
if(c=='+'||c=='*'||c=='a'||c=='('||c==')'||c=='#') return true;
else return false;
}
bool IsVnempty(char c){ //这里是因为出错了之后加的,刚开始没想到
if(c=='e') return true;
else return false;
}
void numberc(char c){
if(c=='E') t=0;
else if(c=='A') t=1;
else if(c=='T') t=2;
else if(c=='B') t=3;
else if(c=='F') t=4;
}
void numberr(char c){
if(c=='+') k=0;
else if(c=='*') k=1;
else if(c=='a') k=2;
else if(c=='(') k=3;
else if(c==')') k=4;
else if(c=='#') k=5;
}
void Analyse(){
q.push('#');
q.push('E');
int i=0;
while(i<=s.length()){
if(q.empty()){
cout<<"Syntax analysis is right"<<endl;
break;
}
else{
if(IsVt(q.top())){
if(q.top()==s[i]){
q.pop();
i++;
continue;
}
else{
cout<<"Error on syntax analysis"<<endl;
break;
}
}
else if(IsVnempty(q.top())){
q.pop();
}
else if(IsVn(q.top())){
numberc(q.top());
numberr(s[i]);
if(ll[t][k]=="err"){
cout<<"Error on syntax analysis"<<endl;
break;
}
else{
q.pop();
string s0;
s0=ll[t][k];
for(int j=s0.length()-1;j>=0;j--){ //其实对于为什么要倒着输入进去有点迷,之后再弄弄清楚吧!
q.push(s0[j]);
}
}
}
else{
cout<<"Error!"<<endl;
break;
}
}
}
}
int main()
{
cin>>s;
s=s+'#';
Analyse();
}
测试了下错误写法,是OK的。
在最后,希望自己能够越来越好吧!呜呜呜我的专业能力何时能站起来,其实还是有些慌啊…