这是我的语法:
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'
如果我更改语法以使模型直接位于“根”(而不是目录)中,并相应地更新文本,则可以正确识别模型。
我做错了什么?
答案 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
应该被接受。