我有一个描述汇编方言的语法。在代码段中,程序员可以引用来自某个列表的寄存器和定义的变量。我还有一个匹配[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]只匹配非空名称?
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是一个标准终端,用于解析单个单词a.k.a标识符
答案 0 :(得分:1)
不,(Register | [IntegerVariableDeclaration])无法匹配Empty。实际上,[IntegerVariableDeclaration]与[IntegerVariableDeclaration | ID]相同,它是匹配的ID规则。
是的,我认为你不能分割你的规则。
我无法重现您的问题(我需要完整的语法),但是,为了解决您的问题,您应该查看有关xtext语法调试的article:
通过在工作流程中添加以下行来在调试模式下编译语法.mwe2
fragment = org.eclipse.xtext.generator.parser.antlr.DebugAntlrGeneratorFragment {}
使用AntlrWorks打开生成的atrl调试语法并查看图表。
答案 1 :(得分:0)
除了Fabien的回答之外,我还想补充一个像
这样的全方位规则。AnyId:
name = ID
;
而不是
(Register|[IntegerVariableDeclaration])
解决了这个问题。需要动态检查AnyId.name是Regiser,Variable还是其他类似Constant。