这个语法是否被考虑在内?

时间:2015-11-17 11:18:05

标签: parsing compiler-construction grammar

考虑以下语法

S --> A|B  
A --> aa   
B --> ab  

这个语法是否被考虑在内?

我觉得这个语法没有留下因素,因为S的两个作品之间的选择不明确我们可以重写制作以推迟这个决定,直到看到足够的输入我们可以做出正确的选择。

我是否遗漏了某些内容,或者这不是因素而已?

1 个答案:

答案 0 :(得分:0)

语法不是LL(1)的原因有几个。在这种情况下,您在S -> AS -> B之间存在 FIRST / FIRST冲突:因为FIRST(A)FIRST(B)重叠,有些情况下您不知道选择哪种产品。

通常教导来解决这些冲突的技术是保留因子和左递归删除,但是这个语法已经是左因素(对于每个非终端,每个产生都有一个不同的前缀)并且它没有任何左递归。

您可以使用另一种技术:替换。在您的情况下,您可以将A -> aa替换为S -> A来删除规则S -> aa

要解决语法冲突,首先必须在A中替换BS

S -> aa | ab

现在我们在S的两个作品之间仍然存在FIRST / FIRST冲突,但这一次,我们可以通过左分解来解决它:

S -> a T
T -> a | b

语法现在没有LL(1)冲突。

(不幸的是,我在解析器构造方面不够精通以了解确定何时何地应用替换的机械方法。但是,这是一种有效的技术。)