如何使这个语法LL(1)?

时间:2015-03-31 10:39:12

标签: compiler-construction

我最初有这个语法。

S -> A | B
A -> Aa | epsilon
B -> Bb | epsilon

我删除了左递归以获得这个:

S -> A | B
A -> A'
A' -> aA' | epsilon
B -> B'
B' -> bB' | epsilon

这个语法不是LL(1),因为First(A)和First(B)有共同的epsilon。我知道常见的第一个符号通常用因子分解。我不知道如何解决A和B First集中的常见epsilon。

1 个答案:

答案 0 :(得分:0)

语法不明确,因为 S A →ε或 S B可以产生空字符串→ε。为了使语法可以解析,你需要解决歧义。

最简单的可能是添加规则 S →ε,然后将其从 A B 中删除,以便它们的基础制作分别是 a b