我试图在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 -> { }
如何修复或取消这些警告?
答案 0 :(得分:2)
字符串{}
可以解析为块,也可以解析为objectExpression。你有几个选择。
在Javascript解析器中,如果block
和objectExpression
之间存在歧义,它将选择父规则中第一个出现的歧义。在下面的表达式中,空块将优先于空对象。
expression:
: block
| objectExpression
;
解析器会抱怨任何歧义(也称为shift / reduce冲突),但它仍然有效。假设Jison解析器与Bison解析器兼容,请使用expect
declaration来禁止警告。
您还可以使块和objectExpressions仅出现在不同的上下文中(例如,块只能出现在if
语句或for
语句之后)。第三种选择是删除对空对象的支持。
答案 1 :(得分:1)
我最后添加了另一个lex规则:
\{\} return 'EMPTY_OBJECT';
并将objectExpression
更改为:
objectExpression:
: 'EMPTY_OBJECT'
| '{' properties '}'
;
它奏效了(尽管它有点难看)。