编程实现给定算术表达式的递归下降分析器。

一、实验题目:
   编程实现给定算术表达式的递归下降分析器。
     算术表达式文法如下: E→E+T | T
                T→T*F | F
                F→(E) | i
设计说明:
   首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。

二、设计分析:

(1)消除文法左递归:
E→TE’
E’→+TE’|ɛ
T→FT’
T’→*FT’|ɛ
F→(E)|i
(2)判断改写后的文法是否为LL(1)文法
对E’:First(+TE’) Ո Follow(E’)={+} Ո {#,)}=Φ
对T’:First(*FT’) Ո Follow(T’)={*} Ո {#,),+}=Φ
对F:First(i) Ո Follow((E))={i} Ո {(}=Φ
(3)所以改写后的文法是LL(1)文法

三、程序代码:

#include<iostream>
using namespace std;
string s;
char c;
bool flag=true;
int cnt;
void E();
void E1();
void T();
void T1();
void F();
void scan(){
	c=s[++cnt];
} 
void E(){
	T();
	E1();
}
void T(){
	F();
	T1();
}
void E1(){
	if(c=='+'){
		scan();
		T();
		E1();
	}else if(c!=')'&&c!='\0'){
		if(flag){
			cout<<"Error!"<<endl;
			flag=false;	
		}
	}
}
void T1(){
	if(c=='*'){
		scan();
		F();
		T1();
	}else if(c!=')'&&c!='\0'&&c!='+'){
		if(flag){
			cout<<"Error!"<<endl;
			flag=false;	
		}
	}
}
void F(){
	if(c=='i') scan();
	else{
		if(c=='('){
			scan();
			E();
			if(c==')'){
				scan();
			}else{
				if(flag){
					cout<<"Error!"<<endl;
					flag=false;	
				}
			}
		}
	}
}
int main(){
	cout<<"请输入程序源代码: ";
	cin>>s;
	c=s[cnt];
	E();
	if(c=='\0'){
		cout<<"Success!"<<endl;
	}else{
		if(flag){
			cout<<"Error!"<<endl;
			flag=false;	
		}
	}
	return 0;
}
posted @ 2021-04-27 17:19  小布丁超级帅  阅读(328)  评论(0)    收藏  举报