为什么我在使用 XText 语法时会得到"Could not resolve reference"?



这是我的语法:

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'

如果我更改语法以使模型直接位于根中(不再在目录中(并相应地更新文本,则模型将被正确识别。

我做错了什么?

Xtext 构建限定名称。因此,如果您的模型有一个具有名称的父模型,则模型名称将是 parentname.modelname

您可以调整IQualifiedNameProvider(子类和绑定DefaultDeclarativeQualifiedNameProvider或绑定SimpleNameProvider(,也可以调整语法以允许模型引用的限定名称

... model=[Model|FQN]

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

正如Christian所提到的,交叉引用依赖于元素的属性"name"(规则创建的实例(,为了避免由于重复而导致的问题,名称提供者的默认实现计算一个限定名称,它将元素的名称(Model(与其容器的限定名称(目录(Christian称之为父级((递归连接(root_name.catalog_name.model_name(。"meteo"的"name"实际上是"myCatalog.meteo"(规则Root没有"name="(。如果您不想调整 IQualifiedNameProvider(仅使用简单名称(,则可以调整语法


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

现在:

Catalog myCatalog
{
Model meteo
Model storm
}

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

应该被接受。

相关内容

最新更新