Javascript 空块和空对象语法冲突警告
我正在尝试在中实现一个解析器。解析器同时支持JSON对象:Javascript 空块和空对象语法冲突警告,javascript,parsing,bison,shift-reduce-conflict,jison,Javascript,Parsing,Bison,Shift Reduce Conflict,Jison,我正在尝试在中实现一个解析器。解析器同时支持JSON对象:{a:1}和块:if(true){statement();} 我的语法看起来像: block: : '{' '}' | '{' statementList '}' ; objectExpression: : '{' '}' | '{' properties '}' ; 在block和objectExpression中都有{}规则,因为我需要同时支持空对象和空块 它可以工作,但会输出很多警告,例如: Confli
{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 -> { }
如何修复或抑制这些警告?可以将字符串
{}
解析为块或objectExpression。你有几个选择
在Javascript解析器中,如果block
和objectExpression
之间存在歧义,它将选择父规则中的第一个。在下面的表达式中,空块将优先于空对象
expression:
: block
| objectExpression
;
解析器会抱怨任何歧义(也称为移位/减少冲突),但它仍然可以工作。假设Jison解析器与Bison解析器兼容,则使用来抑制警告
您还可以使块和对象表达式仅在不同的上下文中出现(例如,块只能出现在
if
语句或for
语句之后)。第三种选择是删除对空对象的支持。我最后添加了另一个lex规则:
\{\} return 'EMPTY_OBJECT';
并将objectExpression
更改为:
objectExpression:
: 'EMPTY_OBJECT'
| '{' properties '}'
;
它成功了(尽管有点难看)。我怀疑这个解决方案是否真的有效(不仅仅是因为它混淆了
{}
和{}
在语法上的不同)。彻底测试它。正确的解决方案包括识别两个空括号语法可能出现的上下文。