使用xtext而不是插件

时间:2012-12-05 11:54:05

标签: xtext

一般情况下,我有我的dsl作为插件,我想创建一个使用我的dsl的新应用

所以我试着写这段代码:

JsonParser p = new JsonParser();
IParseResult r = p.parse(new StringReader("{}")); 
//once that work it will be the file data instead of {}

但是当我进行解析时,节点模型构建器为null,并且以下行具有异常: return doParse(ruleName,in,nodeModelBuilder.get(),0);

我不知道如何初始化nodeModelBuilder

我确定我错过了一些步骤,但我对xtext过程并不熟悉。 谢谢!

3 个答案:

答案 0 :(得分:0)

您已经在Eclipse论坛上阅读了以下答案。您需要通过注入来创建IParser实例。所有依赖项也会被注入。必需的绑定在JsonRuntimeModule中描述。 Xtext使用Guice和这些模块将所有内容粘合在一起。此模式称为依赖注入。


  

...我想创建一个使用我的dsl

的新应用

所以你想在独立模式下使用你的Json DSL。

我的建议:

  • 使用CLI创建最小的Eclipse IApplication,以读取和解析输入文件。 Eclipse IApplication的优势在于您可以轻松部署DSL运行时的无头版本。 [1]
  • 从Xtext的JUnit支持中查看您的JsonInjectorProvider和ParseHelper [2],了解如何在独立模式下使用DSL和Xtext运行时。

[1] http://www.eclipsezone.com/eclipse/forums/t99762.html [2] org.eclipse.xtext.junit.util.ParseHelper

答案 1 :(得分:0)

你不应该直接调用解析器。看到: http://wiki.eclipse.org/Xtext/FAQ#How_do_I_load_my_model_in_a_standalone_Java_application.C2.A0.3F

代码应如下所示:

Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration();
XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);
Resource resource = resourceSet.getResource(new File("/../../some.json").toURI(), true);
Model modelRootElement = (Model) resource.getContents().get(0);

将MyDsl替换为'JsonParser'或'Json'或您的DSL名称。在DSL源代码中查找类JsonStandaloneSetup或JsonParserStandaloneSetup。启动Xtext项目时(或第一次运行工作流时,现在不确定),将生成此类。将Model替换为您的根元素类型。它必须是EObject的子类。

解析/验证/建立AST完成resource.getContents()命令。我知道,不是很直观。这是因为你必须初始化上下文,事实上各种各样的上下文,Guice上下文,EMF上下文,以及其他所有上下文都封装在StandaloneSetup(和RuntimeModule)中。上下文类似于Spring Application Context。

答案 2 :(得分:0)

您需要使用StandaloneSetup以独立模式运行。

See this tutorial for help