E -> E+E|E*E|(E)|a
鉴于语法, 如何将语法转换为LL(1)形式?
E->aX|(E)
X->+E|*E|epsilon
这是LL(1)语法吗?
答案 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. →ε