4

我定义了一个简单的 Xtext 语法,看起来像这样(简化):

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

System:
   'Define System'
   (
     'Define Components' '{' components+=Component+ '}'
   )
   'End'
;

Component:
    'Component' name=ID 'Value' value=Double ';'
;

Double returns ecore::EDouble:
    '-'? INT? '.' INT
;

我想解决的问题是 - 如何将简单的 Java 对象转换为有效的 xtext 文件?

为了简化我的问题,假设我们在 Java 中创建了一个组件列表:

List<Component> components = new ArrayList<Component>();
components.add(new Component("FirstComponent", 1.0));
components.add(new Component("SecondComponent", 2.0));
components.add(new Component("ThirdComponent", 3.0));

我喜欢创建的输出文件应该是这样的:

Define System
   Define Components { 
       Component FirstComponent Value 1.0;
       Component SecondComponent Value 2.0;
       Component ThirdComponent Value 3.0;
   }
End

xtext 语法检查这个文件是很重要的,所以它是有效的。我希望你对我有任何想法。这是我的一些,但到目前为止我不知道如何实现它们:

想法#1:我知道如何读写文件。在我的脑海中,一个解决方案可能如下所示:我的 Java 代码中有列表,现在我想编写一个看起来像上面的输出文件的文件。之后我喜欢阅读这个文件并通过语法检查错误。我怎样才能做到这一点?

想法 #2:如果我想我会使用 JDOM 从 Java 代码创建一个 xml 文件,我希望我可以在 xtext 中做同样的事情。只需定义一个以“End”结尾的父“Define System”(参见我的输出文件),然后添加一个以“}”结尾的子“Define Components {”,然后将子添加到其中,例如“Component FirstComponent Value” 1.0;”。我希望这不会令人困惑:-)

想法#3:我可以使用如下模板并在大括号“{”...“}”之间添加子元素:

Define System
   Define Components { ... }
End

顺便说一句:我已经尝试过Linking Xtext with StringTemplate code generator,但这是另一个问题。希望你有什么想法。

4

2 回答 2

5

您可以为此使用 Xtext 的序列化。与 Java 的默认序列化 API 不同,Xtext 的实现创建了 DSL。

代码如下所示:

Injector injector = Guice.createInjector(new  my.dsl.MyDslRuntimeModule());  
Serializer serializer = injector.getInstance(Serializer.class);  
String s = serializer.serialize(eobj);  

eobj的实例在哪里System

如果你为你的 DSL 编写了一个格式化程序,输出看起来也不错。

相关博文:使用 Xtext 的序列化器实现 toString

于 2012-09-06T14:36:55.960 回答
2

Xtext 为您提供了基于 EMF 的 AST。该 AST 具有 System 和 Component 等类及其对应的属性,例如 Component 的 Value 属性。这些类在您的语言项目的 src-gen 文件夹中可用。

要实例化这些对象,您必须使用同一个包中也提供的工厂类。

要序列化这样的 AST,可以通过创建资源并保存内容来重用标准 EMF 工具。在序列化期间,AST 被验证。

System system = ...; //Creating the AST programmatically
ResourceSet set = new ResourceSetImpl();
Resource resource = set.createResource(URI.create...URI("filename")); //Initializing an EMF resource that represents a file
resource.getContents.add(system); //adding your AST to the file resource
resource.save();

小注:如果您开发 Eclipse 插件,则必须通过调用生成的 «YourLanguage»StandaloneSetup.doSetup() 静态方法来初始化 Xtext 工具。

对于其他编程验证选项,您可以查看 Xtext 测试框架使用的 ParseHelper 和 ValidatorTester 类。

于 2012-09-06T20:36:04.763 回答