我有一些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