【问题标题】:Initializing a (transient) EAttribute while parsing an Xtext resource在解析 Xtext 资源时初始化(瞬态)EAttribute
【发布时间】:2015-02-21 07:06:24
【问题描述】:

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

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

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

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

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

我在 Xtext 语法中找到了一些关于“动作”的注释,我想,可能类似于

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

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

【问题讨论】:

    标签: java xtext eclipse-emf emf


    【解决方案1】:

    我找到了一种方法,将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;
    

    我不知道这是否是正确的方法,但它有效。

    【讨论】:

    • 另一个地方是 IDerivedStateComputer。看看xtextcasts.org/episodes/18-model-optimization
    • 谢谢,克里斯蒂安。根据情况,IDerivedStateComputer 似乎也是一个不错的地方,但据我了解,您需要修改 MWE 生成工作流程。就我而言,IAstFactory 可以通过将其添加到 Guice 模块中直接进行交换,我很高兴,所以现在我将坚持使用该解决方案。
    • 不。 IDerivedStateComputer 也可以通过 guice 绑定来完成
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2010-11-26
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2015-04-18
    相关资源
    最近更新 更多