语法分析:算术表达式递归下降分析程序设计
2008-11-24 22:20
246 查看
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,预期显示fail
(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<iostream> #include<string> 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,预期显示fail
相关文章推荐
- 语法分析:算术表达式递归下降分析程序设计
- 语法分析:算术表达式递归下降分析程序设计
- 语法分析:算术表达式预测分析程序设计
- 递归下降语法分析程序设计
- 1217 实验四 递归下降语法分析程序设计
- 递归下降语法分析程序设计
- 12.16_实验四 递归下降语法分析程序设计
- 实验四 递归下降语法分析程序设计
- 12-16 实验四 递归下降语法分析程序设计
- 1217实验四 递归下降语法分析程序设计
- 编译原理 实验3 递归下降语法分析程序设计
- 递归下降语法分析程序设计
- 递归下降语法分析程序设计
- 1231 实验四 递归下降语法分析程序设计
- 1217 实验四 递归下降语法分析程序设计
- 1217 递归下降语法分析程序设计
- 1217递归下降语法分析程序设计
- 1223 递归下降语法分析程序设计
- 递归下降语法分析程序设计
- 递归下降语法分析程序设计