javascript - 空 block 和空对象语法冲突警告

标签 javascript parsing bison shift-reduce-conflict jison

我正在尝试在 Jison 中实现一个解析器.解析器支持两个 JSON 对象:{ a: 1 } 和 block :if (true) { statement();

我的语法是这样的:

block:
  : '{' '}'
  | '{' statementList '}'
  ;

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

blockobjectExpression 中都有一个 {} 规则,因为我需要同时支持空对象和空 block 。

它可以工作,但会输出很多警告,例如:

Conflict in grammar: multiple actions possible when lookahead token is ; in state 52
- reduce by rule: objectExpression -> { }
- reduce by rule: block -> { }

如何修复或禁止显示这些警告?

最佳答案

字符串 {} 可以解析为 block 或对象表达式。您有几个选择。

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

expression:
    : block
    | objectExpression
    ;

解析器会提示任何歧义(也称为移位/归约冲突),但它仍然可以工作。假设 Jison 解析器与 Bison 解析器兼容,使用 expect declaration抑制警告。

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

关于javascript - 空 block 和空对象语法冲突警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26453583/

相关文章:

javascript - 如何使用jquery从元素中获取类

javascript - 如何使用 Node Express 从嵌套路由重定向到顶级路由?

ios - 将 XML 解析为 NSDictionary

c - 错误: conflicting types for ‘yylval’ extern YYSTYPE yylval

c - 正则表达式匹配行(换行符除外)(FLEX、BISON)

javascript - HTMLcollection 0 列表长度,[n]返回undefined,转换为数组返回空数组

javascript - 如何循环遍历 DataTables jQuery 中的所有行?

java - Java 中最小的(更少的内部代码)、符合规范的 JSON 解析器

php - Magento getUrl 不适用于目录/类别对象?

parsing - 使用 yyparse() 制作两遍汇编程序?