表达式优先级和消歧

Expression precedence and disambiguation

我目前正在努力使 Rust-lang 可以用 Rascal 解析。最初使用的语法是为 Bison 设计的,因此我将其翻译为可用的。我遇到的绊脚石是表达方式。 Rust 在其 Bison 文件中有四种类型的表达式,它们是 nonblock_exprexprnonparen_exprexpr_nostruct。我现有的翻译充满了歧义,但即使在阅读了有关该主题的 Rascal 文档以及 Rascal 和 Java 的可用语法之后,我也不确定如何解决这个问题。我想解决歧义并更好地理解如何进一步解决这个问题。

这是我翻译的一个例子:

syntax Expression
    = Literal
    > Path_expression
    | "self"
    | Macro_expression
    | Path_expression "{" Structure_expression_fields "}"
    | Expression "." Path_generic_args_with_colons
    //> left Expression "." Literal_integer
    | Expression "[" Expression? "]"
    | Expression "(" (Expressions ","?)? ")"
    | "(" (Expressions ","?)? ")"
    | "[" Vector_expression "]"
    | "continue"
    | "continue" Identifier
    | "return"
    | "return" Expression
    | "break"
    | "break" Identifier
    > left  ( Expression "*" Expression
            | Expression "/" Expression
            | Expression "%" Expression
            )
    > left  ( Expression "+" Expression
            | Expression "-" Expression
            > Expression "\<\<" Expression
            | Expression "\>\>" Expression
            > Expression "&" Expression
            > Expression "^" Expression
            > Expression "|" Expression
            > Expression "\<" Expression
            | Expression "\>" Expression
            | Expression "\<=" Expression
            | Expression "\>=" Expression
            > Expression "==" Expression
            | Expression "!=" Expression
            > Expression "||" Expression
            > Expression "&&" Expression
            )
    > right Expression "\<-" Expression
    > right ( Expression "=" Expression
            | Expression "\<\<=" Expression
            | Expression "\>\>=" Expression
            | Expression "-=" Expression
            | Expression "&=" Expression
            | Expression "|=" Expression
            | Expression "+=" Expression
            | Expression "*=" Expression
            | Expression "/=" Expression
            | Expression "^=" Expression
            | Expression "%=" Expression
            )
    | Expression ".."
    | Expression ".." Expression
    | ".." Expression
    | ".."
    | Expression "as" Type
    | "box" Nonparen_expression
    > "box" "(" Expression? ")" Expression
    | Expression_qualified_path
    | Block_expression
    | Block
    | Nonblock_prefix_expression
    ;

来源:

Rust Bison 文件:Github Rust

氧化流氓文件:Github Oxidize

添加了歧义示例 这是一个输入文件的示例(只是文件的不明确部分在解析参数中)。

fn main() {
    let mut config = Config::parse(&flags.build, flags.config.clone());
}

如下所示的输出解析树似乎对前缀表达式 (&) 的构造感到困惑。这种歧义无法在Nonblock_prefix_expressionExpression "." Path_generic_args_with_colons之间做出决定。我希望它能够解析 Nonblock_prefix_expression

  • 查看 http://www.meta-environment.org/doc/books/syntax/sdf-disambiguation/sdf-disambiguation.pdf 了解消除歧义的一般概念以及如何逐步解决歧义。本手册是为 SDF2 编写的,它与 Rascal 有许多共同点。不过要注意差异,{prefer}{avoid} 在 Rascal 中不存在,但可以用库模拟(不建议)。
  • DrAmbiguity 工具可以帮助自动诊断歧义:import analysis::grammars::Ambiguity;diagnose(yourAmbiguousTree),它以非常原始的形式解释了相同子类的不同替代解析树之间的差异和共性细绳。差异是造成歧义的原因:规则和规则应用的顺序在一个备选方案中使用,而在另一个备选方案中不使用。可以通过应用消除歧义过滤器来消除原因,该过滤器仅消除两个备选方案之一(因此它们专注于差异)
  • 如果您对示例输入句子和输出树(尽可能小)有具体的歧义,我们可以提供帮助 whosebug.com