空块和空对象语法冲突警告

时间:2014-10-19 17:55:17

标签: javascript parsing bison shift-reduce-conflict jison

我试图在Jison中实现解析器。解析器支持两个JSON对象:{ a: 1 }和块:if (true) { statement(); }

我的语法如下:

block:
  : '{' '}'
  | '{' statementList '}'
  ;

objectExpression:
  : '{' '}'
  | '{' properties '}'
  ;

{}block都有objectExpression规则,因为我需要同时支持空对象和空块。

它有效,但它会输出许多警告,例如:

Conflict in grammar: multiple actions possible when lookahead token is ; in state 52
- reduce by rule: objectExpression -> { }
- reduce by rule: block -> { }

如何修复或取消这些警告?

2 个答案:

答案 0 :(得分:2)

字符串{}可以解析为块,也可以解析为objectExpression。你有几个选择。

在Javascript解析器中,如果blockobjectExpression之间存在歧义,它将选择父规则中第一个出现的歧义。在下面的表达式中,空块将优先于空对象。

expression:
    : block
    | objectExpression
    ;

解析器会抱怨任何歧义(也称为shift / reduce冲突),但它仍然有效。假设Jison解析器与Bison解析器兼容,请使用expect declaration来禁止警告。

您还可以使块和objectExpressions仅出现在不同的上下文中(例如,块只能出现在if语句或for语句之后)。第三种选择是删除对空对象的支持。

答案 1 :(得分:1)

我最后添加了另一个lex规则:

\{\} return 'EMPTY_OBJECT';

并将objectExpression更改为:

objectExpression:
  : 'EMPTY_OBJECT'
  | '{' properties '}'
  ;

它奏效了(尽管它有点难看)。