我正在尝试生成一个小型 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 ";"
ExpStatement
IDENT ";"
由于这是一个极小化的 JISON 脚本,我不能简单地将“Type”替换为“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 ;
有什么技巧可以解决这个冲突吗?
提前谢谢你!〜本杰明