Jison: уменьшить конфликт там, где на самом деле нет конфликта

Я пытаюсь создать небольшой синтаксический анализатор JavaScript, который также включает типизированные переменные для небольшого проекта.

К счастью, jison уже предоставляет jscore.js, который я только что настроил под свои нужды. После добавления типов я столкнулся с конфликтом сокращений. Я минимизировал проблему до этого минимума ДЖИЗОН:

Jison:

%start SourceElements
%%

// This is up to become more complex soon
Type
    : VAR
    | IDENT
    ;

// Can be a list of statements
SourceElements
    : Statement
    | SourceElements Statement
    ;

// Either be a declaration or an expression
Statement
    : VariableStatement
    | ExprStatement
    ;

// Parses something like: MyType hello;
VariableStatement
    : Type IDENT ";"
    ;

// Parases something like hello;
ExprStatement
    : PrimaryExprNoBrace ";"
    ;

// Parses something like hello;
PrimaryExprNoBrace
    : IDENT
    ;

На самом деле этот скрипт ничего не делает, кроме парсинга двух операторов:

ВыраженияПрисваивания

IDENT IDENT ";"

ExpStatement

IDENT ";"

Поскольку это чрезвычайно минимизированный JISON Script, я не могу просто заменить "Type" на "IDENT" (что, кстати, сработало).

Генерация парсера вызывает следующие конфликты:

Conflict in grammar: multiple actions possible when lookahead token is IDENT in state 8
- reduce by rule: PrimaryExprNoBrace -> IDENT
- reduce by rule: Type -> IDENT
Conflict in grammar: multiple actions possible when lookahead token is ; in state 8
- reduce by rule: PrimaryExprNoBrace -> IDENT
- reduce by rule: Type -> IDENT

States with conflicts:
State 8
  Type -> IDENT . #lookaheads= IDENT ;
  PrimaryExprNoBrace -> IDENT . #lookaheads= IDENT ;

Есть ли хитрость, чтобы исправить этот конфликт?

Заранее благодарю! ~ Бенджамин

1 ответ

Это похоже на ошибку Jison для меня. Это жалуется на неоднозначность в случаях этих двух последовательностей токенов:

  1. IDENT IDENT
  2. IDENT ";"

Состояние, о котором идет речь, достигнуто после смещения первого токена IDENT. Jison отмечает, что ему нужно уменьшить этот токен, и что (он утверждает) он не знает, сводить ли его к типу или к PrimaryExpressionNoBrace.

Но Jison должен уметь различать, основываясь на следующем токене: если это второй IDENT, то только приведение к типу может привести к допустимому анализу, тогда как если это ";" тогда только приведение к PrimaryExpressionNoBrace может привести к правильному анализу.

Вы уверены, что данный вывод идет с данной грамматикой? Можно было бы либо добавить правила, либо модифицировать заданные, чтобы получить неоднозначность, такую ​​как описанная. Это просто кажется таким простым случаем, что я удивлен, что Джисон ошибается. Однако, если это действительно так, то вам следует рассмотреть возможность подачи сообщения об ошибке.

Другие вопросы по тегам