Jison语法分析器生成器,移位减少语法冲突,如何解决



我目前正在使用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,所以我不能使用另一个解析器生成器。我的语法有什么变通办法吗?

看看这些产品:

If: [
[ 'IfBlock' ],
[ 'IfBlock ELSE Body IF_END ']
]

在我看来,语法似乎在说,只有当包含else子句时,if语句才必须由IF_END终止。缺少else子句的if不能由IF_END终止。

这不是我对visualbasic语法的理解。END_IF在多行语法中是必需的,在单行语法中不使用。

因此,您有两个冲突,因为您的If产品接受一些带有END_IF的语句,而另一些不接受:

  • 对于没有END_IFif语句,您有典型的"悬挂其他"歧义。

  • 此外,对于没有END_IF的多行if语句,语法无法判断以下语句是if语句中最后一个子句的一部分还是新语句。(这就是多行if语句需要END_IF的原因

"悬空的其他"模糊性相对温和——也就是说,倾向于偏移而不是减少的正常分辨率将产生正确的结果。如果要消除错误消息,可以使用优先级规则显式解析,使ELSEELSE_IF的优先级高于IF。要使用此技术,您必须使IF在取决于优先级的规则中可见,这基本上意味着从IfBLock中删除IF以留下:

IfBlock: [
[ 'Expression THEN Body' ],
[ 'IfBlock ELSE_IF Expression THEN Body' ]
],
If: [
[ 'IF IfBlock' ],
[ 'IF IfBlock ELSE Body' ]  // IF_END removed
]

您还需要优先级关系:

[ 'left', 'IF' ],
[ 'left', 'ELSE', 'ELSE_IF' ]

这或多或少会让你使用单行if语句,除了你需要用不允许TERMINATOR的东西替换Block

不过,对于多行if语句,您需要不同的语法:

  • END_IF是强制性

  • THENELSE之后以及在ELSEEND_IF之前必须有一个TERMINATOR。换句话说,多行if中的语句块必须从一行的开头开始,并以TERMINATOR结束。

这些限制不仅仅是表面上的:它们之所以存在,是因为否则就不可能将语句放在多行if语句之后,因为如果没有END_IF,后面的任何语句都将添加到最后一个THENELSE子句中。

相关内容

  • 没有找到相关文章

最新更新