1

我将 Xtext 2.0 与 MWE 1 和 XPand 一起使用,但我猜 MWE 2 和 XTend 的问题是完全相同的。

我的 Xtext 语法看起来像这样(摘录):

grammer org.test.Test with org.eclipse.xtext.common.Terminals
generate test "http://www.test.org/test/Test

Model :
    "COMMON STUFF" 
    "{"
    (formatterDefs+=FormatterDef)*
    "}"
    ...

FormatterDef : "Formatter" name=ID  ":" formatter=STRING;

当我使用这个 mwe 定义(摘录)时:

<component class="org.eclipse.xtext.mwe.Reader" path="${project.src.directory}/xtext/model/" >      
    <register class="org.test.TestStandaloneSetup"/>        
<load slot='formatterDefs' type='FormatterDef'/>        
</component>

<component class="org.eclipse.xpand2.Generator">
    <metaModel class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/>
    <expand value="templates::Formatter::formatterTxt FOREACH formatterDefs"/>
</component>

所以这个插槽formatterDefs被 all 填满FormaterDef,然后这个被用于模板,每个想法都很好。

但是我有一些模板需要模型根元素,Model在语法中命名。所以我尝试使用

<load slot='formatterDefs' type='FormatterDef'/>

<expand value="templates::Main::main FOREACH model"/>

反而。

但后来我收到了这个警告:

org.eclipse.xtext.mwe.SlotEntry - 找不到任何“模型”类型的导出元素 -> 插槽“模型”为空。

并且该插槽包含一个空列表。

所以我的问题是:我需要做什么才能将根目录Model放入我的模板中?

4

4 回答 4

1

我的意思是

public class MyDslNameProvider extends DefaultDeclarativeQualifiedNameProvider {

    QualifiedName qualifiedName(Model m) {
        return QualifiedName.create(m.eResource().getURI().toString());
    }
}

public class MyDslRuntimeModule extends
                          org.xtext.example.mydsl.AbstractMyDslRuntimeModule {

    @Override
    public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
        return MyDslNameProvider.class;
    }   
}
于 2011-10-19T17:41:30.373 回答
1

您可以自定义 IQualifiedNameProvider 为模型命名。

〜基督徒

于 2011-10-18T19:19:15.863 回答
1

{Model}可能最好的方法是在规则的开头插入文本,以确保创建。

于 2011-10-23T17:06:15.753 回答
0

一个解决方案是在模型的语法定义中添加一个 ID。

Model : name = ID
  "COMMON STUFF" 
  "{"
  (formatterDefs+=FormatterDef)*
  "}"

我知道之前没有现有的 Model 元素,因此在添加 ID 后,必须创建 Model 元素以包含 Id。

怎么可能有更好的解决方案 - 我会在发布后立即接受。

于 2011-10-12T09:58:34.970 回答