【发布时间】:2014-10-28 16:26:54
【问题描述】:
我有一个描述汇编语言的语法。在代码段中,程序员可以引用某个列表中的寄存器和定义的变量。我也有一个匹配 [reg0++413] 和 [myVariable++413] 的规则:
BinaryBiasInsideFetchOperation:
'['
v = (Register|[IntegerVariableDeclaration]) ( gbo = GetBiasOperation val = (Register|IntValue|HexValue) )?
']'
;
但是当我尝试编译它时,Xtext 会抛出一个警告:
Decision can match input such as "'[' '++' 'reg0' ']'" using multiple alternatives: 2, 3. As a result, alternative(s) 3 were disabled for that input
拆分我注意到的规则,即
BinaryBiasInsideFetchOperation:
'['
v = Register ( gbo = GetBiasOperation val = (Register|IntValue|HexValue) )?
']'
;
BinaryBiasInsideFetchOperation:
'['
v = [IntegerVariableDeclaration] ( gbo = GetBiasOperation val = (Register|IntValue|HexValue) )?
']'
;
很好地单独工作,但不能同时。当我尝试编译它们时,XText 写了许多错误,说列表中的寄存器可能会被模棱两可地处理。所以:
1) 我是对的,规则 v = (Register|[IntegerVariableDeclaration]) 的那部分匹配任何 IntegerVariable 名称包括空,但规则 v = [IntegerVariableDeclaration] 仅匹配非空名称? p>
2) 当我尝试将单独的规则一起编译时,Xtext 认为 [IntegerVariableDeclaration] 可以与 Register 一致,这是否正确?
3) 如何解决这种歧义?
编辑:定义器
Register:
areg = ('reg0' | 'reg1' | 'reg2' | 'reg3' | 'reg4' | 'reg5' | 'reg6' | 'reg7' )
;
IntegerVariableDeclaration:
section = SectionServiceWord? name=ID ':' type = IntegerType ('[' size = IntValue ']')? ( value = IntegerVariableDefinition )? ';'
;
ID 是一个标准终端,它解析一个单词,也就是标识符
【问题讨论】:
-
您能告诉我们Register、IntegerVariableDeclaration和ID规则的定义吗?