这是我的语法:
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 行有误,meteo
和storm
标记为:
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
应该被接受。