我正在嘗試生成一個小型JavaScript解析器,其中也包含一個小型項目的類型變量。Jison:減少實際上沒有衝突的衝突
幸運的是,jison已經提供了一個jscore.js,我只是根據自己的需求進行了調整。加入類型後,我遇到了減少衝突。我最小化到問題這個最小JISON:
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
;
其實這個劇本確實沒有什麼比分析兩種說法:
VariableStatement
IDENT IDENT ";"
ExpStatement
IDENT ";"
由於這是一個最小化的極端腳本JISON,我不能簡單地取代的「類型」是「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 ;
有什麼竅門來解決這個矛盾呢?
謝謝先進! 〜Benjamin
我必須在這裏失去一些東西。我沒有與GNU Bison 2.4.1發生任何衝突。 –
謝謝你的嘗試。也許這是Jison的問題,我實際上正在使用它。 –
@BenjaminSchulte你解決了這個問題嗎?我正在努力解決類似的問題,並找不到任何答案... – Vees