我在使用XText2.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中填充了所有的FormaterDef,然后将其用于模板,并且每个想法都很好。
但是我有一些模板需要模型根元素,在语法中名为Model 。所以我试着用
<load slot='formatterDefs' type='FormatterDef'/>和
<expand value="templates::Main::main FOREACH model"/>而不是。
但我收到了这样的警告:
org.eclipse.xtext.mwe.SlotEntry -无法找到任何类型为'Model‘->槽’模型‘的导出元素是空的。
该插槽包含一个空列表。
因此,我的问题是:Model 需要做什么,才能将根放到模板中?
发布于 2011-10-19 17:41:30
我的意思是
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-18 19:19:15
您可以自定义IQualifiedNameProvider以给模型命名。
~克里斯蒂安
发布于 2011-10-23 17:06:15
最好的方法可能是在规则开始时插入文本{Model},以确保创建。
https://stackoverflow.com/questions/7737617
复制相似问题