编译原理 递归下降分析法C语言

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录(源代码)
#include <stdio.h>
#include <windows.h>
#include <string.h>
char token[20];
char sym;
int p;
void S();
void T();
void U();
void Scaner();
void Error();
void S()








实验题目:递ຫໍສະໝຸດ Baidu子程序
姓名:柏顺顺
学号:540913100201
专业:软件工程JAVA技术
班级:09——02班
递归下降分析法的实现
实验
递归下降分析法是确定的自上而下分析法,这种分析法要求文法是LL(1)文法。它的基本思想是,对文法中的每个非终结符编写一个函数(或子程序),每个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。由于描述语言的文法通常是递归定义的,因此相应的这组函数(或子程序)必然一相互递归的方式进行调用,所以将此种分析方法称为递归下降分析法。
{
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 == ',')
本实验要求构造下述文法的递归下降分析程序:
文法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)文法。
gets(token);
p = 0;
Scaner();
S();
if (sym == '#')
printf("Success!\n");
else
printf("Fail!\n");
return 0;
}
最后构造递归下降分析程序。每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构编写。
(1)当遇到终结符a时,则编写语句
if (当前读来的输入符号== a)读下一个输入符号
(2)当遇到非终结符A时,则编写语句调用A()。
(3)当遇到A—>空串规则时,则编写语句
if (当前读来的输入字符不属于FOLLOW(A))error()
(4)当某个非终结符的规则有很多个候选式是,按LL(1)文法的条件能唯一地选择一个候选式进行推导。
实验结果
实验总结
这次实验内容比较简单。由于有固定的模式来构造程序,因此即使对于其他LL(1)文法也很容易构造其相应的递归下降分析程序。
这次实验我学习了如何将递归下降分析思想具体转化为程序来实现,同时也加深了产生式的Follow集在递归下降分析法中的应用,练习了通过SELECT集判断文法是否为LL(1)文法。
{
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");
相关文档
最新文档