如何从Java项目调用Xtext解析器/ JvmModelInferrer

时间:2012-07-05 09:19:28

标签: xtext

我已经实现了一个简单的小型DSL,它通过使用JvmModelInferrer方法从输入文件生成类。我试图找出如何在常规Java项目的代码中调用解析器和代码genarator。因此,在我的非Xtext项目的主类中的某些时候,我可以创建一个文件,将其传递给我的DSL的Xtext解析器/ codeGenerator,结果将类文件生成到我选择的文件夹中(在我的java项目中)。 此案例未在文档中介绍,因此非常感谢任何帮助,谢谢!

更新:到目前为止,我的代码如下所示:

    private  static IGenerator generator;

    /**
     * @param args
     */
    public static void main(String[] args) {

        // this line registers the EMF for our DSL
        Injector injector = new HyRuleStandaloneSetup().createInjectorAndDoEMFRegistration();
        ResourceSet rs = new ResourceSetImpl();
        File file = new File(
                "C:/Documents and Settings/chmamat2/runtime-EclipseXtext/hyrule.project/src/hyrule/project/main.hrule");
        Resource resource = rs.getResource(URI.createURI(file.toURI().toString()), true);

        //setup the generator
        generator = injector.getInstance(IGenerator.class);

        //setup the file system access
        final EclipseResourceFileSystemAccess2 fsa = new EclipseResourceFileSystemAccess2();


        generator.doGenerate(resource, fsa);

1 个答案:

答案 0 :(得分:2)

基本上,您可以将DSL作为EMF模型打开:创建EMF资源集,然后使用ResourceSet API打开文件(通过创建表示文件的文件或平台uri),并打开其内容。 / p>

但是,这仅在您不使用Xbase时才有效。如果使用Xbase,则必须使用Xtext API提供的Guice注入器来实例化ResourceSet。如果初始化ResourceSet,它的工作方式与以前相同。

要使用注入器,请使用StandaloneSetup类对其进行实例化 - 如果您计划将Eclipse IDE中的代码与您自己的编辑器一起使用,或者通过注册带有基于Xtext的执行的eclipse扩展,请不要这样做厂。例如,请参阅我Xtext Reflective Tree editor project中注册的编辑器。

要同时调用代码生成器,您还有以下几种可能性:

  1. 您可以使用具有Xtext项目性质的Eclipse项目。如果它已经设置好了,你只需创建/修改你的DSL文件,而构建器就会神奇地完成我之前提到的所有内容 - 无处可做。
  2. 您也可以在代码中注入IGenerator(当有一个注入的类时),这样您就可以在打开原始的基于EMF的Xtext模型后以编程方式调用它。