2

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

这是我的翻译示例:

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

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

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

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

4

1 回答 1

1
  • 查看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),它以非常原始的形式解释了相同子字符串的不同替代解析树之间的差异和共性。差异是歧义的原因:规则和规则应用的顺序在一个替代方案中使用但在另一个替代方案中没有使用。可以通过应用消歧过滤器来消除原因,该消歧过滤器仅删除两种选择中的一种(因此它们专注于差异)
  • 如果您对示例输入句子和输出树(尽可能小)有具体的歧义,我们可以在 stackoverflow.com 上提供帮助
于 2017-04-12T10:04:47.613 回答