私は現在、Rust-lang を Rascal で解析可能にする作業を行っています。もともと使われていた構文は Bison 用に作られたものなので、使えるように翻訳しています。私が到達したつまずきは表現です。nonblock_expr
Rust の 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_expression
んExpression "." Path_generic_args_with_colons
。を介して解析することを期待していNonblock_prefix_expression
ます。