Xtext:名称中的交叉引用

Xtext: Crossreference inside names

我希望在我的对象名称中有一个交叉引用。 在我的语言中,我会有这个:

2. Sentence
....
2.a. sentence
    1. sentence

其中2为“2.句名”

在这里,我希望“2.a.sentence”的名称是“2.a”,而“2”在“2.a”中是对“的引用” 2.句子"。

我已经试过了:

(name = ([Step|StepName] '.' CHAR ))

(name = (step = [Step|StepName] '.' CHAR))

但我刚遇到错误。

现在我正在寻找更改由 Xtext 生成的实现文件(我更改了 getName() 方法)但没有得到我想要的结果。由于“2.a”中包含的 EObjects 在当时的 QualifiedName 中没有“2”,只有 "a"。如果我们查看“1. sentence”,我希望它有 QualifiedName “2.a.1”

问题的解决方法可以看这里:

http://www.cs.ru.nl/J.Hooman/DSL/AdvancedXtextManual.pdf

不过我会解释的。

首先,您将创建一个扩展原始 IQualifiedNameProvider 的 IQualifideNameProvider。在此 classe 中,您将创建 QualifiedName 的组成方式。这是我的做法:

class MyDslQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider {
  @Inject
  IQualifiedNameConverter converter = new
  IQualifiedNameConverter.DefaultImpl();

  override QualifiedName getFullyQualifiedName(EObject obj) {
    if (obj instanceof HelloGreeting) {
      val nodes = NodeModelUtils.findNodesForFeature(obj,
                           MyDslPackage.Literals.HELLO_GREETING__PERSON);
      for (node : nodes) {
        val text = NodeModelUtils.getTokenText(node);
        if (text !== null) {
          return converter.toQualifiedName(text);
        }
      }
    }
    return super.getFullyQualifiedName(obj);
  }
}

此扩展代码将生成一个 QualifiedName,它正是您的交叉引用 HELLO_GREETING_PERSON 的文本,如果您想编写您的名称,您需要获取 EObject 的名称并连接字符串以创建限定名称。

例如这是我的代码,我添加它来组成我的名字:

var a = obj.eContainer();
var FN = (a as UseCase).getName() + "." + text + "." + (obj as Extension).getName();

然后你需要改变你的 RunTimeModulo 添加:

override Class<? extends IQualifiedNameProvider>
bindIQualifiedNameProvider() {
   return typeof(MyDslQualifiedNameProvider);
} 

在你里面 class RunTimeModule。

这对我有用。这些代码是从上面的 PDF 中精确摘录的,我只是想帮助理解需要做什么。