语法分析:算术表达式递归下降分析程序设计
来源:互联网 发布:苹果手机日版数据漫游 编辑:程序博客网 时间:2024/05/06 00:13
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)文法的条件能唯一地选择一个候选式进行推导.
测试用例
(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
(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
0 0
- 语法分析:算术表达式递归下降分析程序设计
- 语法分析:算术表达式递归下降分析程序设计
- 语法分析:算术表达式预测分析程序设计
- 递归下降语法分析程序设计
- 算术表达式的语法分析及语义分析程序设计 —— LR分析法、输出三元式
- 【现代编译器】语法分析——正则表达式,上下文无关文法,递归下降分析,分析树
- 自顶向下的语法分析–递归下降分析–表达式求值
- 编译原理 实验3 递归下降语法分析程序设计
- 递归下降语法分析
- 递归下降的语法分析
- 递归下降的语法分析
- 递归下降语法分析实验
- 递归下降语法分析实验
- 算术表达式语法分析
- 算术表达式的语法分析及语义分析程序设计 —— LR分析法、输出三元式(续)
- 自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表)
- 【编译原理】自顶向下的语法分析之递归下降分析法
- 分析算术表达式是否有效(间接递归的例子)
- NLPIR汉语分词系统在VS中使用
- 小鑫的城堡(sdut_2798)
- 关于深度学习在量化投资的应用
- 学习资源
- Swift中编写单例的正确方式
- 语法分析:算术表达式递归下降分析程序设计
- iOS两个.a文件合并成一个.a文件
- hdu 1102 Constructing Roads 最小生成树prim模板题
- 有关SQL语句写法注意的那些事情(原创整理)
- 时间的处理方式
- CodeForces 660F Bear and Bowling 4(斜率DP+二分)
- 2016sdau课程练习专题二 1001
- 强制解除安卓系统密码
- 如何配置mobiscroll让其支持startMonth和startDay