递归下降分析算术表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

实验总结

通过本次试验实践掌握了自上而下语法分析法的特点。掌握了递归下降语法分析的基本原理和方法。运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。此分析法简单,直观,易构造分析程序,但是不适于文法过于复杂的,不易检查出错误。在试验的过程中,遇到了一些问题,都是粗心大意而造成,并非是对文法分析和编程的熟悉问题,说明了我再以后的试验中应该更细心的编写程序的每一步,对于本次试验所出现的马虎,应该牢记,以后不再犯同样的错误。

相关文档
最新文档