使用XText语法时,为什么会出现“无法解析引用”的问题?

时间:2018-06-21 18:55:25

标签: xtext

这是我的语法:

grammar com.x.x.x.XxxDsl with org.eclipse.xtext.common.Terminals
generate xxxDsl "http://www.x.x.x.com/xxx/xtext/XxxDsl"

Root:
    catalogs+=Catalog*
    instances+=Instance*
    ;

Catalog returns Catalog:
    'Catalog' name=ID
    '{'
    models+=Model*
    '}'
    ;

Model returns Model:
    'Model' name=ID
    ;

Instance returns Instance:
    'Instance'
    name=ID
    'of'
    model=[Model]
;

这是我的文字:

Catalog myCatalog
{
    Model meteo
    Model storm
}

Instance wintermeteo of meteo
Instance strongstorm of storm

最后2行有误,meteostorm标有:

Couldn't resolve reference to Model 'meteo'/'storm'

如果我更改语法以使模型直接位于“根”(而不是目录)中,并相应地更新文本,则可以正确识别模型。

我做错了什么?

2 个答案:

答案 0 :(得分:0)

Xtext构建合格名称。因此,如果您的模型有一个具有名称的父对象,则模型名称将为parentname.modelname

您可以修改IQualifiedNameProvider(子类并绑定DefaultDeclarativeQualifiedNameProvider或绑定SimpleNameProvider),或者必须修改语法以允许模型引用使用合格的名称

... model=[Model|FQN]

使用

FQN: ID ("." ID)*;//pseudocode

答案 1 :(得分:0)

正如克里斯蒂安所说,交叉引用依赖于元素(由规则创建的实例)的属性“名称”,为避免重复产生的问题,名称提供程序的默认实现会计算一个限定名称,递归地将元素(模型)的名称与其容器的合格名称(目录(基督徒称其为父级))连接起来(root_name.catalog_name.model_name)。 “ meteo”的“名称”实际上是“ myCatalog.meteo”(规则根没有“ name =“)。如果您不想改写IQualifiedNameProvider(仅适用于简单名称),则可以改编语法


... model=[Model|FQN]
...
FQN: ID ("." ID)*; 

现在:

Catalog myCatalog
{
    Model meteo
    Model storm
}


Instance wintermeteo of myCatalog.meteo
Instance strongstorm of myCatalog.storm

应该被接受。