编译原理-递归下降分析法的实现-内附源码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

姓名:关海超

学号:200807010209

专业:计算机科学与技术

班级:08—02班

递归下降分析法的实现

实验要求

递归下降分析法是确定的自上而下分析法,这种分析法要求文法是LL(1)文法。它的基本思想是,对文法中的每个非终结符编写一个函数(或子程序),每个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。由于描述语言的文法通常是递归定义的,因此相应的这组函数(或子程序)必然一相互递归的方式进行调用,所以将此种分析方法称为递归下降分析法。

本实验要求构造下述文法的递归下降分析程序:

文法G[S]:

S —> a | ^ | (T)

T —> T,S | S

实验内容

首先,消去该文法左递归,得到文法G’[S]:

S —> a | ^ | (T)

T —> ST’

T’—> ,ST’ | 空串

然后,根据LL(1)文法的判断条件,对非终结符S和T’的不同产生式的SSELECT集进行考察,经验证改进后的文法已经是LL(1)文法。

最后构造递归下降分析程序。每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构编写。

(1)当遇到终结符a时,则编写语句

if (当前读来的输入符号== a) 读下一个输入符号

(2)当遇到非终结符A时,则编写语句调用A()。

(3)当遇到A —> 空串规则时,则编写语句

if (当前读来的输入字符不属于FOLLOW(A) ) error()

(4)当某个非终结符的规则有很多个候选式是,按LL(1)文法的条件能唯一地选择一个候选式进行推导。

实验结果

实验总结

这次实验内容比较简单。由于有固定的模式来构造程序,因此即使对于其他LL(1)文法也很容易构造其相应的递归下降分析程序。

这次实验我学习了如何将递归下降分析思想具体转化为程序来实现,同时也加深了产生式的Follow集在递归下降分析法中的应用,练习了通过SELECT集判断文法是否为LL(1)文法。

附录(源代码)

#include

#include

#include

char token[20];

char sym;

int p;

void S();

void T();

void U();

void Scaner();

void Error();

void S()

{

if (sym == 'a' || sym == '^')

Scaner();

else

if (sym == '(')

{

Scaner();

T();

if (sym == ')')

Scaner();

else

Error(); }

else

Error(); }

void T()

{

S();

U();

}

void U()

{

if (sym == ',')

{

Scaner();

S();

U();

}

else

if (sym != ')')

Error(); }

void Scaner()

{

sym = token[p++]; }

void Error()

{

printf("Error!\n");

exit(0);

}

int main()

{

printf("Please input : \n");

gets(token);

p = 0;

Scaner();

S();

if (sym == '#')

printf("Success!\n");

else

printf("Fail!\n");

return 0;

}

相关文档
最新文档