Parsing 如何解析Xtext变量';静态名称和关键字?

Parsing 如何解析Xtext变量';静态名称和关键字?,parsing,assembly,xtext,Parsing,Assembly,Xtext,我有一个描述汇编语言的语法。在代码部分,程序员可以引用特定列表中的寄存器和定义的变量。此外,我还有一个与[reg0++413]和[myVariable++413]匹配的规则: BinaryBiasInsideFetchOperation: '[' v = (Register|[IntegerVariableDeclaration]) ( gbo = GetBiasOperation val = (Register|IntValue|HexValue) )? ']' ;

我有一个描述汇编语言的语法。在代码部分,程序员可以引用特定列表中的寄存器和定义的变量。此外,我还有一个与[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=(寄存器|[IntegerVariableDeclaration])的那部分匹配任何整数变量名称,包括空名称,但规则v=[IntegerVariableDeclaration]只匹配非空名称

2) 当我试图一起编译单独的规则时,Xtext认为[integervariableddeclaration]可以与Register一致,这对吗

3) 如何解决这种模糊性

编辑:定义者

Register: 
    areg = ('reg0' | 'reg1' | 'reg2' | 'reg3' | 'reg4' | 'reg5' | 'reg6' | 'reg7' )
;

IntegerVariableDeclaration:
    section = SectionServiceWord? name=ID ':' type = IntegerType ('[' size = IntValue ']')? ( value = IntegerVariableDefinition )? ';'
;
ID是一个标准终端,它解析单个单词,也称为标识符

  • 否,(寄存器|[IntegerVariableDeclaration])不能匹配为空。实际上,[IntegerVariableDeclaration]与[IntegerVariableDeclaration | ID]相同,它与ID规则匹配

  • 是的,我想你不能违反规则

  • 我无法重现您的问题(我需要完整的语法),但是,为了解决您的问题,您应该了解以下关于xtext语法调试的内容:

    • 通过在工作流中添加以下行,在调试模式下编译语法。mwe2
      fragment=org.eclipse.xtext.generator.parser.antlr.DebugAntlrGeneratorFragment{}

    • 使用AntlWorks打开生成的antrl调试语法并检查图表


  • 除了Fabien的答案,我还想补充一条全匹配规则,比如

    AnyId:
        name = ID
    ;
    
    而不是

     (Register|[IntegerVariableDeclaration])
    

    解决了这个问题。我们需要动态检查AnyId.name是否是寄存器、变量或类似常量的其他内容。

    能否向我们展示寄存器、IntegerVariableDeclaration和ID规则的定义?