当前位置:文档之家› 递归下降分析算术表达式

递归下降分析算术表达式

递归下降分析算术表达式
计算机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 <iostream>
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"<<endl;
else
cout<<"fail"<<endl;
i=0; // 重新输入时,下标置0 }
}
void E()
{
T();
E2();
}
void E2()
{
if(sym=='+')
{
advance();
T();
E2();
}
else if (sym != ')' && sym != '#')
{
cout<<"error!"<<endl;
exit(0);
}
}
void T()
{
F();
T2();
}
void T2()
{
if(sym=='*')
{
advance();
F();
T2();
}
else if(sym!='+'&&sym!=')'&&sym!='#')
{
cout<<"error!"<<endl;
exit(0);
}
}
void F()
{
if(sym=='(')
{
advance();
E();
if(sym==')')
advance();
else
{
cout<<"error!"<<endl;
exit(0);
}
}
else if(sym=='i')
{
advance();
}
else
{
cout<<"error!"<<endl;
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
实验总结
通过本次试验实践掌握了自上而下语法分析法的特点。

掌握了递归下降语法分析的基本原理和方法。

运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。

函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。

此分析法简单,直观,易构造分析程序,但是不适于文法过于复杂的,不易检查出错误。

在试验的过程中,遇到了一些问题,都是粗心大意而造成,并非是对文法分析和编程的熟悉问题,说明了我再以后的试验中应该更细心的编写程序的每一步,对于本次试验所出现的马虎,应该牢记,以后不再犯同样的错误。

相关主题