2

私は現在、Rust-lang を Rascal で解析可能にする作業を行っています。もともと使われていた構文は Bison 用に作られたものなので、使えるように翻訳しています。私が到達したつまずきは表現です。nonblock_exprRust の Bison ファイルには、expr、 、nonparen_exprおよびの 4 種類の式がありexpr_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

Rascal ファイルを酸化する: Github Oxidize

追加されたあいまいな例 これは入力ファイルの例です (ファイルのあいまいな部分だけが parse のパラメーターにあります)。

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

以下に示す出力解析ツリーは、接頭辞付きの式 (&) の構成について混乱しているようです。このあいまいさは、 と の間を決定できませNonblock_prefix_expressionExpression "." Path_generic_args_with_colons。を介して解析することを期待していNonblock_prefix_expressionます。 ここに画像の説明を入力

4

1 に答える 1