我目前正在使用jison开发Visual Basic转换器。我的语法中有这些冲突:
Conflict in grammar: multiple actions possible when lookahead token is ELSE in state 11
- reduce by rule: If -> IfBlock
- shift token (then go to state 16)
Conflict in grammar: multiple actions possible when lookahead token is ELSE_IF in state 11
- reduce by rule: If -> IfBlock
- shift token (then go to state 17)
Conflict in grammar: multiple actions possible when lookahead token is TERMINATOR in state 27
- reduce by rule: IfBlock -> IF Expression THEN Body
- shift token (then go to state 13)
Conflict in grammar: multiple actions possible when lookahead token is TERMINATOR in state 29
- reduce by rule: IfBlock -> IfBlock ELSE_IF Expression THEN Body
- shift token (then go to state 13)
States with conflicts:
State 11
If -> IfBlock . #lookaheads= $end TERMINATOR IF_END ELSE ELSE_IF SUB_END
If -> IfBlock .ELSE Body IF_END #lookaheads= $end TERMINATOR IF_END ELSE ELSE_IF SUB_END
IfBlock -> IfBlock .ELSE_IF Expression THEN Body #lookaheads= $end ELSE ELSE_IF TERMINATOR SUB_END IF_END
State 27
IfBlock -> IF Expression THEN Body . #lookaheads= $end ELSE ELSE_IF TERMINATOR SUB_END IF_END
Body -> Body .TERMINATOR Line
Body -> Body .TERMINATOR
State 29
IfBlock -> IfBlock ELSE_IF Expression THEN Body . #lookaheads= $end ELSE ELSE_IF TERMINATOR SUB_END IF_END
Body -> Body .TERMINATOR Line
Body -> Body .TERMINATOR
这里是我的语法的简化版本(删除了动作:]:>
const grammar = { Root: [ [ '' ], [ 'Body' ] ], Body: [ [ 'Line' ], [ 'Body TERMINATOR Line' ], [ 'Body TERMINATOR' ] ], Line: [ [ 'Expression' ], [ 'Statement' ] ], Statement: [ [ 'Return' ], [ 'If' ] ], Expression: [ [ 'Code' ] ], Return: [ [ 'RETURN Expression' ], [ 'RETURN' ] ], Code: [ [ 'SUB_START Identifier PARAM_START ParamList PARAM_END TERMINATOR Body SUB_END' ] ], IfBlock: [ [ 'IF Expression THEN Body' ], [ 'IfBlock ELSE_IF Expression THEN Body' ] ], If: [ [ 'IfBlock' ], [ 'IfBlock ELSE Body IF_END' ] ] }
当我尝试为If语句实现规则时,就会发生冲突,它似乎与Body规则冲突。我花了将近一天的时间来解决它,但是我不能。我知道解析器只能向前看一个令牌,但是我自己找不到解决方案。而且我必须与吉森结盟,所以我不能使用其他解析器生成器。我的语法有什么解决方法吗?
我目前正在使用jison开发Visual Basic转换器。而且我的语法中有这些冲突:语法中的冲突:当状态为11的超前标记为ELSE时,可能会执行多个动作-...
看这些作品: