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 для меня. Это жалуется на неоднозначность в случаях этих двух последовательностей токенов:
- IDENT IDENT
- IDENT ";"
Состояние, о котором идет речь, достигнуто после смещения первого токена IDENT. Jison отмечает, что ему нужно уменьшить этот токен, и что (он утверждает) он не знает, сводить ли его к типу или к PrimaryExpressionNoBrace.
Но Jison должен уметь различать, основываясь на следующем токене: если это второй IDENT, то только приведение к типу может привести к допустимому анализу, тогда как если это ";" тогда только приведение к PrimaryExpressionNoBrace может привести к правильному анализу.
Вы уверены, что данный вывод идет с данной грамматикой? Можно было бы либо добавить правила, либо модифицировать заданные, чтобы получить неоднозначность, такую как описанная. Это просто кажется таким простым случаем, что я удивлен, что Джисон ошибается. Однако, если это действительно так, то вам следует рассмотреть возможность подачи сообщения об ошибке.