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

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

我正在尝试在中实现一个解析器。解析器同时支持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 -> { }

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

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

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

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


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

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

\{\} return 'EMPTY_OBJECT';
并将
objectExpression
更改为:

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

它成功了(尽管有点难看)。

我怀疑这个解决方案是否真的有效(不仅仅是因为它混淆了
{}
{}
在语法上的不同)。彻底测试它。正确的解决方案包括识别两个空括号语法可能出现的上下文。