我目前正在使用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_IF
的if
语句,您有典型的"悬挂其他"歧义。此外,对于没有
END_IF
的多行if
语句,语法无法判断以下语句是if
语句中最后一个子句的一部分还是新语句。(这就是多行if
语句需要END_IF
的原因
"悬空的其他"模糊性相对温和——也就是说,倾向于偏移而不是减少的正常分辨率将产生正确的结果。如果要消除错误消息,可以使用优先级规则显式解析,使ELSE
和ELSE_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
是强制性在
THEN
和ELSE
之后以及在ELSE
和END_IF
之前必须有一个TERMINATOR
。换句话说,多行if
中的语句块必须从一行的开头开始,并以TERMINATOR
结束。
这些限制不仅仅是表面上的:它们之所以存在,是因为否则就不可能将语句放在多行if
语句之后,因为如果没有END_IF
,后面的任何语句都将添加到最后一个THEN
或ELSE
子句中。