Я пытаюсь создать небольшой анализатор 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 ";"
Отчет об опыте
IDENT ";"
Поскольку это чрезвычайно минимизированный сценарий JISON, я не могу просто заменить «Тип» на «ИДЕНТИФИКАТОР» (что, кстати, сработало).
Генерация парсера вызывает следующие конфликты:
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 ;
Есть ли какой-нибудь трюк, чтобы исправить этот конфликт?
Заранее благодарю! ~ Бенджамин