2020-11-21 LL(1)语法分析器的构造

【问题描述】

给定以下文法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集,画出预测表。如图所示
2020-11-21 LL(1)语法分析器的构造_第1张图片


```cpp
#include
#include
#include
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();
 } 

2020-11-21 LL(1)语法分析器的构造_第2张图片

2020-11-21 LL(1)语法分析器的构造_第3张图片
测试了下错误写法,是OK的。
在最后,希望自己能够越来越好吧!呜呜呜我的专业能力何时能站起来,其实还是有些慌啊…

你可能感兴趣的:(2020-11-21 LL(1)语法分析器的构造)