我已经定义了一个简单的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中做同样的事情。只需定义一个以“结束”结束的父“定义系统”(参见我的输出文件),然后添加一个以“}”结尾的子项“定义组件{”,然后将子项添加到此处,例如“Component FirstComponent Value 1.0;”。我希望这不会令人困惑: - )想法#3: 我可以使用如下的模板,并在大括号“{”...“}”之间添加子项:
Define System
Define Components { ... }
End
顺便说一下:我已经尝试了Linking Xtext with StringTemplate code generator,但这是另一个问题。希望你有任何想法。
答案 0 :(得分:4)
您可以使用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编写了格式化程序,输出也会很好。
答案 1 :(得分: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类。