1

我正在尝试在Jison中实现解析器。解析器支持 JSON objects:{ a: 1 }和 blocks: 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 -> { }

如何修复或抑制这些警告?

4

2 回答 2

2

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

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

expression:
    : block
    | objectExpression
    ;

解析器会抱怨任何歧义(也称为移位/减少冲突),但它仍然可以工作。假设 Jison 解析器与 Bison 解析器兼容,请使用expect声明来抑制警告。

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

于 2014-10-19T17:58:36.140 回答
1

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

\{\} return 'EMPTY_OBJECT';

并将其更改objectExpression为:

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

它起作用了(尽管它有点难看)。

于 2014-10-19T20:46:40.113 回答