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