【问题标题】:Understanding simple XText cross-referencing了解简单的 XText 交叉引用
【发布时间】:2025-12-13 03:55:01
【问题描述】:

我有一个关于 Xtext for Eclipse 的问题。

我有一个简单的示例,我相信它非常接近在线文档和操作指南中给出的示例(例如:http://blog.efftinge.de/2012/05/implementing-fowlers-state-machine-dsl.html)。

我的语法如下所示:

MyModel : 
 properties += PropertyDefinition+
  rules += Rule+
;

PropertyDefinition :
 'property' name=ID '{'
   propertyValues += PropertyValue+
 '}'
;

PropertyValue :
 name=ID code=ID ';'
;

Rule :
 'rule:' value=[PropertyValue]
;

我的问题是规则“规则”中的交叉引用不起作用。所以我的问题基本上是,我对交叉引用的使用与上面链接中提供的有什么区别。

他们的示例开箱即用,无需自定义范围或类似内容。所以我想,我的也应该如此。

提前感谢您! :)

【问题讨论】:

  • 不管具体的问题是什么,总是更详细地指定“它不起作用”对你来说意味着什么是个好主意。

标签: dsl xtext cross-reference


【解决方案1】:

PropertyValue 包含在命名元素 (PropertyDefinition) 中,默认情况下会将 PropertyValue 的名称转换为限定名称,即

PropertDefintion.name+'.'+PropertyValue.name

如果要引用限定名称,则交叉引用需要为此使用句法规则:

Rule : 'rule' value=[PropertyValue|QualifiedName]

如果您不想使用限定名称,则必须更改 IQualifiedNameStrategy。 只需在运行时模块中绑定不同的实现,例如:

public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
  return SimpleNameProvider.class;
}

【讨论】: