如何序列化Xtext解析树/ AST的片段?

时间:2017-12-12 21:43:40

标签: serialization abstract-syntax-tree xtext xtend

我有一些xtend代码从我的DSL中的文件中获取解析树/ AST。

我想要一个序列化树中任何节点的方法。这意味着我希望用我的DSL语言中的文本在解析树中的某个地方使用EObject。

所以,如果我的语言程序是

class C {
    int foo = 3;
}

解析树可能看起来像

MyProgram
|_ MyClass
   |_MyFieldDecl
     |_Type
     | |_IntType
     |_Identifier
     |_Expression
       |_LiteralInteger

如果我在树中分配了一个变量x MyFieldDecl对象,那么我可能想调用

var s = serialize(x)

获取String,“int foo = 3;”

那么,我该如何实现serialize()函数?

我在搜索时找到的代码将序列化整个树,但不是序列化节点/片段。

我在xtext核心代码中发现了一些似乎是在使用ISerializer或GrammarAccessExtensions的某个实例执行此操作的内容。我试着注入

@Inject @Extension GrammarAccessExtensions _grammarAccessExtensions

并使用

获取序列化
val s = _grammarAccessExtensions.grammarFragmentToString(e, prefix);

其中e是EObject,是解析树中的某个节点。

声明失败

val main = injector.getInstance(MyClass)

出现此错误:

Exception in thread "main" com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for org.eclipse.xtext.xtext.generator.model.project.IXtextProjectConfig was bound.
  while locating org.eclipse.xtext.xtext.generator.model.project.IXtextProjectConfig
    for field at org.eclipse.xtext.xtext.generator.XtextGeneratorNaming.projectConfig(Unknown Source)
  while locating org.eclipse.xtext.xtext.generator.XtextGeneratorNaming
    for field at org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessExtensions._xtextGeneratorNaming(Unknown Source)
  while locating org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessExtensions
    for field at myorg.MyClass._grammarAccessExtensions(Unknown Source)
  while locating myorg.MyClass

1 error
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)
    at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)
    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)
    at myorg.MyClass.main(MyClass.java:435)

我认为这意味着我需要绑定或注入内容,但是我几天前就开始使用这个代码库了,所有这些对我来说都是新的。

我还试图从xtext核心中复制代码以获得ISerializer并调用

s = GrammarAccessExtensions.grammarFragmentToString(serializer, e, prefix)

失败了:

java.lang.NullPointerException: Invalid context: Grammar returns ScenarioModel

0 个答案:

没有答案