注:文章来自于我的博客shawnluo.com,欢迎访问~!
文法G[S]如下:
S->aAaB|bAbB
A->S|db
B->bB|a
分析句子adbaba
要求:
提前消除文法的左递归及提取左公共因子。
求出FIRST集、FOLLOW集、SELECT集、判空、输出预测分析表、
输出对句子的分析过程。
一、主要内容
1、检查文法是否为LL(1)文法
2、代码介绍:
(1)初始定义参数,给定文法的开始符号、非终结符、终结符、文法产生式。定义三个字典用来表示FIRST集、FOLLOW集、SELECT集。
(移植到其他文法上只需修改这一部分初始定义的参数,其余的程序都是通用的。)
(2)初始化函数init(),打印开始符号、文法产生式。并将每个非终结符加入FIRST集、FOLLOW集作为“键”,同时将其“值”置空;将每个产生式加入SELECT集作为“键”,同时将其“值”置空。
再向开始符号G的FOLLOW集中加入“#”
(3)求FIRST集
①getFirst()函数,根据每条产生式,求出每个非终结符的FIRST集。
这里有两种情况:
I.产生式右部第一个元素为终结符(也即小写字母)的情况。将产生式按“->”分为左部、右部,然后判断右部第一个元素是否为小写字母(if not part_right[0].isupper())。如果是,说明该元素为终结符,则直接将其加入左部的非终结符的FIRST集中。
II.产生式右部第一个元素