Jison:减少实际上没有冲突的冲突



我正在尝试生成一个小型JavaScript解析器,其中还包括一个小项目的类型变量。

幸运的是,jison 已经提供了一个 jscore.js我只是根据自己的需求对其进行了调整。添加类型后,我遇到了减少冲突。我将问题最小化到这个最小 JISON:

吉森:

%start SourceElements
%%
// This is up to become more complex soon
Type
    : VAR
    | IDENT
    ;
// Can be a list of statements
SourceElements
    : Statement
    | SourceElements Statement
    ;
// Either be a declaration or an expression
Statement
    : VariableStatement
    | ExprStatement
    ;
// Parses something like: MyType hello;
VariableStatement
    : Type IDENT ";"
    ;
// Parases something like hello;
ExprStatement
    : PrimaryExprNoBrace ";"
    ;
// Parses something like hello;
PrimaryExprNoBrace
    : IDENT
    ;

实际上,此脚本只分析两个语句:

变量语句

IDENT IDENT ";"

快速声明

IDENT ";"

由于这是一个极其最小化的 JISON 脚本,我不能简单地将"类型"替换为"IDENT"(顺便说一句,这有效)。

生成分析器会引发以下冲突:

Conflict in grammar: multiple actions possible when lookahead token is IDENT in state 8
- reduce by rule: PrimaryExprNoBrace -> IDENT
- reduce by rule: Type -> IDENT
Conflict in grammar: multiple actions possible when lookahead token is ; in state 8
- reduce by rule: PrimaryExprNoBrace -> IDENT
- reduce by rule: Type -> IDENT
States with conflicts:
State 8
  Type -> IDENT . #lookaheads= IDENT ;
  PrimaryExprNoBrace -> IDENT . #lookaheads= IDENT ;

有什么技巧可以解决这个冲突吗?

提前谢谢你!~本杰明

这对我来说看起来像一个 Jison 错误。 它抱怨这两个令牌序列的情况存在歧义:

  1. 识别识别
  2. 识别 ";"

所讨论的状态是在转移第一个 IDENT 令牌后达到的状态。 Jison观察到它需要减少该标记,并且(它声称)它不知道是减少到类型还是PrimaryExpressionNoBrace。

但是 Jison 应该能够根据下一个标记进行区分:如果它是第二个 IDENT,那么只有简化为 Type 才能导致有效的解析,而如果它是 ";",那么只有简化为 PrimaryExpressionNoBrace 才能导致有效的解析。

您确定给定的输出符合给定的语法吗? 可以添加规则或修改给定的规则以产生诸如所描述的歧义。 这似乎是一个如此简单的案例,我很惊讶 Jison 弄错了。 但是,如果确实如此,那么您应该考虑提交错误报告。

相关内容

  • 没有找到相关文章

最新更新