0

一般来说,我有我的 dsl 作为插件,我想创建一个使用我的 dsl 的新应用程序

所以我试着写这段代码:

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

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

而且我不确定如何初始化 nodeModelBuilder

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

4

3 回答 3

0

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


...我想创建一个使用我的 dsl 的新应用程序

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

我的建议:

  • 使用 CLI 创建一个最小的 Eclipse IApplication 来读取和解析输入文件。Eclipse IApplication 的优点是您可以轻松部署 DSL 运行时的无头版本。[1]
  • 查看您的 JsonInjectorProvider 和来自 Xtext 的 JUnit 支持的 ParseHelper [2] 以获取如何在独立模式下使用您的 DSL 和 Xtext 运行时的示例。

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

于 2012-12-06T08:53:21.590 回答
0

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

请参阅本教程以获取帮助

于 2014-02-10T02:22:10.220 回答
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 应用程序上下文。

于 2012-12-17T00:52:33.780 回答