2013-10-19 82 views
2

我正在嘗試生成一個小型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

+0

我必須在這裏失去一些東西。我沒有與GNU Bison 2.4.1發生任何衝突。 –

+0

謝謝你的嘗試。也許這是Jison的問題,我實際上正在使用它。 –

+0

@BenjaminSchulte你解決了這個問題嗎?我正在努力解決類似的問題,並找不到任何答案... – Vees

回答

1

這看起來像Jison的bug。它是在令牌的這兩個序列的情況下抱怨歧義:

  1. IDENT IDENT
  2. IDENT「;」

有問題的狀態是在移動第一個IDENT標記後到達的狀態。 Jison注意到它需要減少該標記,並且(它聲稱)它不知道是減少到Type還是減少到PrimaryExpressionNoBrace。但是Jison應該能夠基於下一個標記進行區分:如果它是第二個IDENT,那麼只有減少到Type才能導致有效的分析,而如果它是「;」那麼只有減少到PrimaryExpressionNoBrace才能導致有效的分析。

你確定給定的輸出符合給定的語法嗎?既可以添加規則,也可以修改給定的規則以產生歧義,如所描述的那樣。這看起來像是一個簡單的例子,我很驚訝Jison錯了。但是,如果它確實存在,那麼你應該考慮提交一個錯誤報告。

+0

我相信這是[bug 205](https://github.com/zaach/jison/issues/205#ref-commit-dae36a9) ,2014年1月(由其他人)報告。 – rici