我正在尝试使用来自DSL的URI导入EMF资源。下面我将介绍如何导入EPackages,但我无法探索"这些包装内容是什么。
使用Fowler的状态机DSL的默认示例,我在语法标题中添加了:
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
然后在语法本身:
Statemachine :
(imports+=Import)*
// the default stuff
('classes' classes+= [ecore::EObject|ID]+ 'end')?
('resetEvents'
resetEvents+=[Event]+
'end')?
;
Import:
'import' importURI=STRING
;
在工作流程中,我确保我有:
// old scoping and exporting API
fragment = scoping.ImportURIScopingFragment auto-inject {}
fragment = exporting.SimpleNamesFragment auto-inject {}
// scoping and exporting API
//fragment = scoping.ImportNamespacesScopingFragment auto-inject {}
//fragment = exporting.QualifiedNamesFragment auto-inject {}
此外,它似乎引起了我读过的其他帖子中的问题,所以我评论了以下内容:
// provides the necessary bindings for java types integration
//fragment = types.TypesGeneratorFragment auto-inject {}
// generates the required bindings only if the grammar inherits from Xbase
//fragment = xbase.XbaseGeneratorFragment auto-inject {}
// provides a preference page for template proposals
//fragment = templates.CodetemplatesGeneratorFragment auto-inject {}
我还取消了以下内容:
fragment = validation.ValidatorFragment auto-inject {
composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
}
总而言之,我可以创建两个实例,例如test1.statemachine和test2.statemachine。 然后我可以写test1:
import "platform:/resource/test/test2.statemachine"
正如所料,我能够在< resetEvents'中引用test2中的事件。部分。但是,以下(作为示例,但我也尝试过使用其他元模型):
import "platform:/plugin/org.eclipse.xtext.example.fowlerdsl/model/generated/Statemachine.ecore"
只允许我参考EPackage" statemachine",当我希望能够引用该包中的任何内容(其EClasses,其EOperations等等)时。为了能够访问这些信息,我缺少什么?
答案 0 :(得分:1)
显然,晚安的睡眠是最好的建议,所以这就是我所缺少的:
('classes' classes+= [ecore::EObject|FQN]+ 'end')?
FQN: ID ("." ID)*;