是否有LL(0)解析器这样的东西?

Can*_*ell 23 parsing compiler-theory


我在某个地方看到了一个问题,询问LL(0)和LR(0)解析器之间的区别.是否有LL(0)解析器这样的东西?如果是这样,他们如何在不查看任何令牌的情况下进行解析?

Apa*_*ala 21

LL(0)解析器会查看标记,但它们不会决定应用哪些生成.他们只是确定序列是否属于该语言.这意味着每个非终端符号必须具有单个右侧,并且可能没有递归.

G == ID name lastname
name == STRING
lastname == STRING

# lexer rules
# -----------
ID == [0-9]+
STRING == <unicode>+
Run Code Online (Sandbox Code Playgroud)

请注意,正如@ 280Z28所提到的,需要一个单独的词法分析器来处理可变长度部分(IDSTRING),或者语法不会LL(0).

应用于解析具有该语法的输入的生成序列需要零预测.

如果在解析了部分给定输入序列之后可以应用多个生产,则确定性需要前瞻.

从理论上讲,语法会产生一种语言,并且在这种情况下,歧义(具有多种方法来推导给定的短语)很好.在解析中,只有一种方式是语义(意义),这就是我们想要的.

在解析编程语言时,前瞻是了解下一个要使用的语法生成所需的信息.

在LL(0)语言中,没有选择,因此输入序列可以被接受和解析,也可以被拒绝.

  • 由于使用了正闭包,您的示例语法不是 LL(0)。该语言需要限制为固定长度的标识符和字符串,或者您需要将您的“词法分析器”规则分离到一个不是 LL(0) 的单独语法中,以说明解析部分,该部分在预解析部分上运行词法标记,如 LL(0)。 (2认同)