【发布时间】:2013-08-16 10:37:03
【问题描述】:
E -> E+E|E*E|(E)|a
鉴于语法, 如何将语法转换为 LL(1) 形式?
E->aX|(E)
X->+E|*E|epsilon
这是 LL(1) 语法吗?
【问题讨论】:
标签: context-free-grammar automata
E -> E+E|E*E|(E)|a
鉴于语法, 如何将语法转换为 LL(1) 形式?
E->aX|(E)
X->+E|*E|epsilon
这是 LL(1) 语法吗?
【问题讨论】:
标签: context-free-grammar automata
原始语法是左递归的,因此不是 LL(1),实际上对于任何 k 都不是 LL(k)。
幸好左递归可以去掉。标准算法通过分别处理立即左递归(正如我们在这里)和间接左递归来做到这一点。立即左递归是两者中较简单的情况。维基百科的文章解释了它here。
基本上你将递归引用之后的部分移动到一个新的产生(尾部)中,它也有一个ε 替代,
X -> ε|+E|*E
然后,您从原始产生式中删除左递归替代方案,并允许 X 遵循所有剩余的非递归替代方案,
E -> (E)X|aX
请注意,您的提案错过了括号表达式后面的X,因此它无法识别相同的语言。
【讨论】:
) 为这个语法找到 FIRST(S) 和 FOLLOW(S): S → d S a S → c S b S → ε
【讨论】: