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