【问题标题】:How to resolve Xtext variables' names and keywords statically?如何静态解析 Xtext 变量的名称和关键字?
【发布时间】: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规则的定义吗?

标签: parsing assembly xtext


【解决方案1】:
  1. 不,(Register|[IntegerVariableDeclaration]) 不能匹配 Empty。实际上,[IntegerVariableDeclaration] 与 [IntegerVariableDeclaration|ID] 相同,是匹配 ID 规则。

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

  3. 我无法重现你的问题(我需要完整的语法),但是,为了解决你的问题,你应该看看这个关于 xtext 语法调试的article

    • 通过将以下行添加到您的 workflow.mwe2 中以调试模式编译语法
      fragment = org.eclipse.xtext.generator.parser.antlr.DebugAntlrGeneratorFragment {}

    • 用 AntlrWorks 打开生成的 antrl 调试语法并查看图表。

【讨论】:

    【解决方案2】:

    除了 Fabien 的回答之外,我还想补充一个像

    这样的全匹配规则
    AnyId:
        name = ID
    ;
    

    而不是

     (Register|[IntegerVariableDeclaration])
    

    解决问题。需要动态检查 AnyId.name 是 Regiser、Variable 还是其他类似 Constant。

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2020-09-26
      • 2011-08-21
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多