Выражение приоритета и неоднозначности
В настоящее время я работаю над тем, чтобы сделать Rust-lang доступным для Rascal. Первоначально используемый синтаксис создан для Bison, поэтому я перевожу его для удобства использования. Камни преткновения, которых я достиг, - это выражения. Rust имеет четыре типа выражений в своем файле Bison, и они 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
;
Источники:
Руст Зубр файл: Гитхуб Руст
Oxidize Rascal file: 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
,
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)
в довольно простой форме объясняется, в чем заключаются различия и общие черты между различными альтернативными деревьями разбора для одной и той же подстроки. Различия являются причиной неоднозначности: правила и порядки применения правил, которые используются в одной альтернативе, а не в другой. Причину можно устранить, применив фильтры устранения неоднозначности, которые удаляют только одну из двух альтернатив (поэтому они фокусируются на различиях) - Если у вас есть конкретные неясности с примерами входных предложений и выходных деревьев (как можно меньше), мы можем помочь на stackru.com