gpt4 book ai didi

java - 将对象转换为 Xtext DSL

转载 作者:搜寻专家 更新时间:2023-11-01 02:13:28 24 4
gpt4 key购买 nike

我已经定义了一个简单的 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 {”,然后将子级添加到其中,例如“组件 FirstComponent 值 1.0;”。我希望这不会造成混淆 :-)

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

Define System
Define Components { ... }
End

顺便说一句:我已经试过了Linking Xtext with StringTemplate code generator ,但这是另一个问题。希望您有任何想法。

最佳答案

您可以为此使用 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 编写了格式化程序,输出也会很好看。

相关博文:Implement toString with Xtext's Serializer

关于java - 将对象转换为 Xtext DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12302206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com