繁体   English   中英

将对象转换为Xtext DSL

[英]Convert Object to Xtext DSL

我定义了一个简单的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

顺便说一句:我已经尝试过用StringTemplate代码生成器链接Xtext ,但这是另一个问题。 希望你有什么想法。

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

代码如下所示:

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

其中eobjSystem的实例。

如果您为DSL编写了格式化程序,则输出也将看起来不错。

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

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类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM