(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