В настоящее время я работаю над тем, чтобы Rust-lang можно было анализировать с помощью Rascal. Первоначально используемый синтаксис создан для Bison, поэтому я перевожу его, чтобы его можно было использовать. Камнем преткновения, которого я достиг, являются выражения. В файле Bison Rust есть четыре типа выражений: nonblock_expr
, expr
, nonparen_expr
и 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
Файл Oxidize Rascal: Github Oxidize
Добавлен пример неоднозначности Это пример входного файла (только неоднозначная часть файла находится в параметрах синтаксического анализа).
fn main() {
let mut config = Config::parse(&flags.build, flags.config.clone());
}
Выходное дерево синтаксического анализа, как показано ниже, кажется запутанным в конструкции выражения с префиксом (&). Эта двусмысленность не может решить между Nonblock_prefix_expression
и Expression "." Path_generic_args_with_colons
. Я ожидаю, что он проанализирует файл Nonblock_prefix_expression
.
box
иself
. - person Jurgen Vinju   schedule 12.04.2017