2

我正在尝试生成一个小型 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 脚本,我不能简单地将“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 ;

有什么技巧可以解决这个冲突吗?

提前谢谢你!〜本杰明

4

1 回答 1

1

对我来说,这看起来像一个 Jison 错误。在这两个令牌序列的情况下,它抱怨模棱两可:

  1. 标识标识
  2. 标识“;”

有问题的状态是在移动第一个 IDENT 令牌后达到的状态。Jison 观察到它需要减少该标记,并且(它声称)它不知道是减少为 Type 还是 PrimaryExpressionNoBrace。

但是 Jison 应该能够根据下一个标记进行区分:如果它是第二个 IDENT,那么只有减少到一个 Type 才能导致有效的解析,而如果它是“;” 那么只有减少到 PrimaryExpressionNoBrace 才能导致有效的解析。

您确定给定的输出符合给定的语法吗?可以添加规则或修改给定的规则以产生歧义,例如所描述的。这似乎是一个如此简单的案例,我很惊讶 Jison 弄错了。但是,如果确实如此,那么您应该考虑提交错误报告。

于 2013-10-28T21:46:54.253 回答