我正在尝试生成一个小型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 错误。 它抱怨这两个令牌序列的情况存在歧义:
- 识别识别
- 识别 ";"
所讨论的状态是在转移第一个 IDENT 令牌后达到的状态。 Jison观察到它需要减少该标记,并且(它声称)它不知道是减少到类型还是PrimaryExpressionNoBrace。
但是 Jison 应该能够根据下一个标记进行区分:如果它是第二个 IDENT,那么只有简化为 Type 才能导致有效的解析,而如果它是 ";",那么只有简化为 PrimaryExpressionNoBrace 才能导致有效的解析。
您确定给定的输出符合给定的语法吗? 可以添加规则或修改给定的规则以产生诸如所描述的歧义。 这似乎是一个如此简单的案例,我很惊讶 Jison 弄错了。 但是,如果确实如此,那么您应该考虑提交错误报告。