logo资料库

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

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
实验要求
实验内容
实验结果
实验总结
附录(源代码)
编 译 原 理 实 验 报 告 姓名:关海超 学号: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();
T(); if (sym == ')') Scaner(); else Error(); } else printf("Please input : \n"); gets(token); p = 0; Scaner(); S(); if (sym == '#') printf("Success!\n"); else printf("Fail!\n"); return 0; } void S() { if (sym == 'a' || sym == '^') Scaner(); else if (sym == '(') { Scaner(); 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() {
分享到:
收藏