给定语法 G 定义
A -> Ca
B -> Cb
C -> e|f
这个文法是LL(1)吗?
我意识到我们可以将其压缩为一行,但这不是这个问题的重点。
主要是,LL(1) 语法可以有多个以相同非终结符开头的规则吗?
作为后续问题,如何为上述语法构建解析表?
我已经解决了以下问题:
FIRST(A) = {e,f}
FIRST(B) = {e,f}
FIRST(C) = {a,b}
FOLLOW(A) = {}
FOLLOW(B) = {}
FOLLOW(C) = {a,b}
我查看了this post ,但不明白他们是如何从 FIRST 和 FOLLOW 发展到餐 table 的。
最佳答案
您给出的语法不是 LL(1),因为两个产生式 A → Ca 和 A → Cb 之间存在 FIRST/FIRST 冲突。
一般来说,以相同非终结符开头的相同非终结符的多个产生式的语法不会是 LL(1),因为您会遇到 FIRST/FIRST 冲突。有些具有此属性的语法是 LL(1),尽管它们本质上是退化的情况。例如,考虑以下语法:
A → Ea
A → Eb
E → ε
这里,非终结符 E 仅扩展为空字符串 ε,因此实际上并不存在。因此,上面的语法是 LL(1),因为两个产生式之间不存在 FIRST/FIRST 冲突。要看到这一点,这是解析表:
a b $
A Ea Eb -
E ε ε -
希望这有帮助!
关于parsing - LL(1) 文法可以有多个以相同非终结符开头的规则吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21710238/