递归下降分析算术表达式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
递归下降分析算术表达式
计算机092—07 邹芬芬
●实验目的:
(1)掌握自上而下语法分析的要求与特点。
(2)掌握递归下降语法分析的基本原理和方法。
(3)掌握相应数据结构的设计方法。
●实验内容:
编程实现给定算术表达式的递归下降分析器。
算术表达式文法如下:E→E+T | T
T→T*F | F
F→(E) | i
●设计分析
题目所给的文法不为LL(1)文法,应改写成如下文法:
E →TE2
E2→+TE2 |∑
T →FT2
T2→*FT2 | ∑
F →(E) | i
采用递归下降分析法时,需要求出E2和T2 的FOLLOW集:
FOLLOW(E2)={),#}
FOLLOW(T2)={+,),#}
递归下降分析法是确定的自上而下分析法,基本思想是,对文法中的每个非终结符编写一个函数,每个函数的功能是识别由该非终结符所表示的语法成分。因此需要分别构造E,E2,T,T2,F函数来执行自己的识别功能,根据文法的内容顺序决定函数的识别功能。advance函数用于字符串的推进,input函数用于字符串的输入。
●程序代码
#include
using namespace std;
char a[80]; // 字符串的存入
char sym; // 单个的判断字符
int i=0; // 字符串下标
void E(); // 功能识别函数
void E2(); // 功能识别函数
void T(); // 功能识别函数
void T2(); // 功能识别函数
void F(); // 功能识别函数
void input(); // 输入函数
void advance(); // 字符串小标进一函数
void main()
{
while(1)
{
input();
advance();
E(); // 从首个推导式E开始
if (sym=='#')
cout<<"success"< else cout<<"fail"< i=0; // 重新输入时,下标置0 } } void E() { T(); E2(); } void E2() { if(sym=='+') { advance(); T(); E2(); } else if (sym != ')' && sym != '#') { cout<<"error!"< exit(0); } } void T() { F(); T2(); } void T2() { if(sym=='*') { advance(); F(); T2(); } else if(sym!='+'&&sym!=')'&&sym!='#') { cout<<"error!"< exit(0); } } void F() { if(sym=='(') { advance(); E(); if(sym==')') advance(); else { cout<<"error!"< exit(0); } } else if(sym=='i') { advance(); } else { cout<<"error!"< exit(0); } } void input() { cout<<"请输入需识别的句子:"; cin>>a; } void advance() { sym=a[i]; i++; } 测试用例 (1)只含有一个字符的形式: i E (2) 含有‘+’的形式: i+i i+E (3) 含有‘*’的形式: i*i i* (4) 含有‘(’‘)’的形式:、 (i) () (5) 综合形式: (i+i)*(i+i) i*(i+i) i*i+i 实验总结 通过本次试验实践掌握了自上而下语法分析法的特点。掌握了递归下降语法分析的基本原理和方法。运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。此分析法简单,直观,易构造分析程序,但是不适于文法过于复杂的,不易检查出错误。在试验的过程中,遇到了一些问题,都是粗心大意而造成,并非是对文法分析和编程的熟悉问题,说明了我再以后的试验中应该更细心的编写程序的每一步,对于本次试验所出现的马虎,应该牢记,以后不再犯同样的错误。