我正在尝试在 Jison 中实现一个解析器.解析器支持两个 JSON 对象:{ a: 1 }
和 block :if (true) { statement();
。
我的语法是这样的:
block:
: '{' '}'
| '{' statementList '}'
;
objectExpression:
: '{' '}'
| '{' properties '}'
;
block
和 objectExpression
中都有一个 {}
规则,因为我需要同时支持空对象和空 block 。
它可以工作,但会输出很多警告,例如:
Conflict in grammar: multiple actions possible when lookahead token is ; in state 52
- reduce by rule: objectExpression -> { }
- reduce by rule: block -> { }
如何修复或禁止显示这些警告?
最佳答案
字符串 {}
可以解析为 block 或对象表达式。您有几个选择。
在 Javascript 解析器中,如果 block
和 objectExpression
之间存在歧义,它将选择在父规则中排在第一位的那个。在以下表达式中,空 block 优先于空对象。
expression:
: block
| objectExpression
;
解析器会提示任何歧义(也称为移位/归约冲突),但它仍然可以工作。假设 Jison 解析器与 Bison 解析器兼容,使用 expect
declaration抑制警告。
您还可以使 block 和 objectExpressions 仅出现在不同的上下文中(例如, block 只能出现在 if
语句或 for
语句之后)。第三种选择是取消对空对象的支持。
关于javascript - 空 block 和空对象语法冲突警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453583/