如何解决Xtext变量'名字和关键字静态?

时间:2014-10-23 09:26:46

标签: parsing assembly xtext

我有一个描述汇编方言的语法。在代码段中,程序员可以引用来自某个列表的寄存器和定义的变量。我还有一个匹配[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标识符

2 个答案:

答案 0 :(得分:1)

  1. 不,(Register | [IntegerVariableDeclaration])无法匹配Empty。实际上,[IntegerVariableDeclaration]与[IntegerVariableDeclaration | ID]相同,它是匹配的ID规则。

  2. 是的,我认为你不能分割你的规则。

  3. 我无法重现您的问题(我需要完整的语法),但是,为了解决您的问题,您应该查看有关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。