Parsing 为什么要为野牛的每一次行动制定规则

Parsing 为什么要为野牛的每一次行动制定规则,parsing,bison,yacc,context-free-grammar,lalr,Parsing,Bison,Yacc,Context Free Grammar,Lalr,在搜索Bison语法时,我发现了以下C语法示例: 我不明白为什么要为每个逻辑操作制定规则。与下面的结构相比,有什么优势吗 binary_expression: : object // imagine it can be bool, int, real ... | binary_expression AND_OP binary_expression | binary_expression OR_OP binary_expression ; 你引用的语法是明确的

在搜索Bison语法时,我发现了以下C语法示例:

我不明白为什么要为每个逻辑操作制定规则。与下面的结构相比,有什么优势吗

binary_expression:
    : object // imagine it can be bool, int, real ...
    | binary_expression AND_OP binary_expression
    | binary_expression OR_OP binary_expression
    ;

你引用的语法是明确的

您建议的是不明确的,尽管yacc/bison允许您使用优先规则来解决不明确的问题

使用使运算符优先级显式的语法有一些优点:

  • 这是对语言的精确描述。优先规则不是语法形式主义的一部分,很难推理。特别是,没有通用的方法来证明他们做了他们想要做的事情

  • 语法是独立的。歧义语法只能通过添加优先规则来理解。这对于语言标准中使用的语法尤其重要,但通常会影响自动构建其他基于语法的工具的尝试

  • 显式语法更一般。并非所有运算符限制都可以用数字优先级比较轻松描述

  • 优先规则可以通过错误地解决移位来隐藏语法中的错误,从而减少语法中其他地方的冲突,这些冲突恰好使用了一些相同的标记。由于未报告已解决的冲突,语法编写者未收到问题警告

另一方面,优先规则确实有一些优势:

  • 优先级表简洁地描述了运算符优先级,这对于快速参考很有用

  • 生成的语法需要更少的单元生成,略微提高了解析速度。(通常不明显,但仍然…)

  • 使用优先级声明解决某些冲突要容易得多,尽管理解冲突是如何解决的可能并不明显。(典型的例子是悬而未决的else歧义。)这种情况与对运算符优先级的直观理解几乎没有关系,因此使用优先级规则有点麻烦


语法的总大小实际上不受使用优先规则的影响。如前所述,优先规则避免了单位生产的需要,但每个单位生产对应于一个优先声明,因此总行数相同。非终端数量少,但非终端成本低;yacc/bison的主要麻烦在于声明所有语义类型,但这很容易自动化。

您引用的语法是明确的

您建议的是不明确的,尽管yacc/bison允许您使用优先规则来解决不明确的问题

使用使运算符优先级显式的语法有一些优点:

  • 这是对语言的精确描述。优先规则不是语法形式主义的一部分,很难推理。特别是,没有通用的方法来证明他们做了他们想要做的事情

  • 语法是独立的。歧义语法只能通过添加优先规则来理解。这对于语言标准中使用的语法尤其重要,但通常会影响自动构建其他基于语法的工具的尝试

  • 显式语法更一般。并非所有运算符限制都可以用数字优先级比较轻松描述

  • 优先规则可以通过错误地解决移位来隐藏语法中的错误,从而减少语法中其他地方的冲突,这些冲突恰好使用了一些相同的标记。由于未报告已解决的冲突,语法编写者未收到问题警告

另一方面,优先规则确实有一些优势:

  • 优先级表简洁地描述了运算符优先级,这对于快速参考很有用

  • 生成的语法需要更少的单元生成,略微提高了解析速度。(通常不明显,但仍然…)

  • 使用优先级声明解决某些冲突要容易得多,尽管理解冲突是如何解决的可能并不明显。(典型的例子是悬而未决的else歧义。)这种情况与对运算符优先级的直观理解几乎没有关系,因此使用优先级规则有点麻烦


语法的总大小实际上不受使用优先规则的影响。如前所述,优先规则避免了单位生产的需要,但每个单位生产对应于一个优先声明,因此总行数相同。非终端数量少,但非终端成本低;yacc/bison的主要麻烦在于声明所有语义类型,但这很容易自动化。

示例中语法的AST将大于使用优先级的AST,对吗?它将是每个操作的一个节点。@growinx:通常我们将单位产品排除在AST之外。所以,不,AST是相同的。请记住,AST不是严格的解析树。某些不必要的细节被抽象出来了。这就是为什么我们称之为抽象语法树。示例中语法的AST将大于使用优先级的AST,对吗?它将是每个操作的一个节点。@growinx:通常我们将单位产品排除在AST之外。所以,不,AST是相同的。请记住,AST不是严格的解析树。某些不必要的细节被抽象出来了。这就是为什么我们称之为抽象语法树。
binary_expression:
    : object // imagine it can be bool, int, real ...
    | binary_expression AND_OP binary_expression
    | binary_expression OR_OP binary_expression
    ;