解析 Xtext 资源时初始化(瞬态)EAttribute

Initializing a (transient) EAttribute while parsing an Xtext resource

假设我有一个简单的 Xtext 规则

Hello: "Hello" name=STRING "!";

但是除了 name EAttribute 之外,我的(以前存在的)EClass Hello 还有一个类型为 EString 的 EAttribute source(或枚举类型,但现在让我们假设 EString)。

该字段不应在 DSL 本身中表示(因此,它在某种程度上是 transient)。相反,我希望在 Xtext 解析器读取和实例化对象时将此字段设置为 "Xtext"。 (我有其他方法可以创建 Hello 的实例,并为其设置其他值)。

是否可以在我的 Hello: 规则中添加一些内容来自动设置 source 的值?还是我必须在某处拦截解析器?

我在 Xtext 语法中发现了一些关于 "actions" 的注释,我想,也许是

Hello: { current.source = "Xtext" } "Hello" name=STRING "!";

可以解决问题,但似乎不允许执行此类操作...

我找到了一种方法,通过子类化 org.eclipse.xtext.parser.DefaultEcoreElementFactory 和 Guice-Injecting 它作为我的语言的 org.eclipse.xtext.parser.IAstFactory

我覆盖 create() 并执行

EObject obj = super.create(...);
if(obj instanceof Hello) 
  ((Hello)obj).setSource("Xtext");
return obj;

我不知道这是否正确,但它确实有效。