Выражение приоритета и неоднозначности

В настоящее время я работаю над тем, чтобы сделать 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
Другие вопросы по тегам