语法分析:算术表达式递归下降分析程序设计

时间:2022-02-27 17:05:31
1、实验目的: 
(1)掌握自上而下语法分析的要求与特点。 
(2)掌握递归下降语法分析的基本原理和方法。 
(3)掌握相应数据结构的设计方法。 
2、实验内容: 
编程实现给定算术表达式的递归下降分析器。 
算术表达式文法如下: 
E-->E+T|T 
T-->T*F|F 
F-->(E)|i 
3、设计说明: 
首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。 
4、设计分析 
这个题目属于比较典型的递归下降语法分析。需要先将原算术表达式方法改写为LL(1)文法为: 
E-->TE' 
E'-->+TE'|ε 
T-->FT' 
T'-->*FT'|ε 
F-->(E)|i 
然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。 
具体方法为: 
(1)当遇到终结符a时,则编写语句 
If(当前读到的输入符号==a)读入下一个输入符号 
(2)当遇到非终结符A时,则编写语句调用A()。 
(3)当遇到A-->ε规则时,则编写语句 
If(当前读到的输入符号不属于Follow(A))error() 
(4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导. 

//源程序代码 
#include 
#include 
using namespace std; 
void E(); 
void E1(); 
void T(); 
void T1(); 
void F(); 
string s; 
int i; 
int ERR; 
int SwitchNum; 
int main() 

do 

s=""; 
i=0; 
ERR=0; 
cout<<"Please enter your sentence:"<<endl;
cin>>s; 
s.resize(s.size()+1); 
s[s.size()-1]='#'; 
E(); 
if(s[i]=='#') 
cout<<"success"<<endl;
else 
cout<<endl;
cout<<"输入一个整数继续,其它类型退出:"; 
}while(cin>>SwitchNum); 
return 0; 

void E() 

if(ERR==0) 

T(); 
E1(); 


void E1() 

if(ERR==0) 

if(s[i]=='+') 

++i; 
T(); 
E1(); 

else if(s[i]!='#'&&s[i]!=')') 

cout<<"fail"<<endl;
ERR=1; 



void T() 

if(ERR==0) 

F(); 
T1(); 


void T1() 

if(ERR==0) 

if(s[i]=='*') 

++i; 
F(); 
T1(); 

else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+') 

cout<<"fail"<<endl;
ERR=1; 



void F() 

if(ERR==0) 

if(s[i]=='(') 

++i; 
E(); 
if(s[i]==')') 
++i; 
else if(s[i]== '#') 

cout<<"fail"<<endl;
ERR=1; 
++i; 


else if(s[i]=='i') 
++i; 
else 

cout<<"fail"<<endl;
ERR=1; 




测试用例 
(1)输入i,预期显示success 
(2)输入iii,预期显示fail 
(3)输入a,预期显示fail 
(4)输入(i),预期显示success 
(5)输入(a),预期显示fail 
(6)输入(i+i),预期显示success 
(7)输入(i+i,预期显示fail 
(8)输入((i*i)+i)*i,预期显示success 
(9)输入((((i+i*i)))),预期显示success 
(10)输入(i+ia,预期显示fail 
(11)输入i+i*i+i*a,预期显示fai