2013-10-19 47 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