如何将语法转换为LL(1)语法形式?

时间:2013-08-16 10:37:03

标签: context-free-grammar automata

E -> E+E|E*E|(E)|a

鉴于语法, 如何将语法转换为LL(1)形式?

E->aX|(E)
X->+E|*E|epsilon

这是LL(1)语法吗?

2 个答案:

答案 0 :(得分:1)

原始语法是递归的,因此不是LL(1),实际上不是任何k的LL(k)。

幸运的是,可以删除左递归。标准算法通过单独解决立即左递归(我们在这里)和间接左递归来实现这一点。立即左递归是两者的简单情况。维基百科的文章解释了它here

基本上,您将递归引用后的部分移动到新的生产(尾部),也有ε替代,

   X -> ε|+E|*E

然后从原始作品中删除左递归替代,并允许X跟踪所有剩余的非递归替代,

   E -> (E)X|aX

请注意,您的提案在括号内的表达式后面会遗漏X,因此它无法识别相同的语言。

答案 1 :(得分:-1)

)查找此语法的FIRST(S)和FOLLOW(S):  S→d S a S. →c S b S. →ε