我创建了一个新的XText项目,其中包含一个定义语法的xtext文件,并且不需要更改项目中的任何其他文件。我定义的语法花费了大约150行,当试图“生成语言基础结构”时,一切都进行得很顺利,但是后来我对它做了一些扩展,现在基础结构生成失败了:
460476 [main] ERROR mf.mwe2.launch.runtime.Mwe2Launcher - Java heap space
java.lang.OutOfMemoryError: Java heap space
at java.util.ArrayList.iterator(Unknown Source)
at org.eclipse.xtext.util.formallang.PdaUtil$TraversalItem.<init>(PdaUtil.java:247)
at org.eclipse.xtext.util.formallang.PdaUtil.newItem(PdaUtil.java:531)
at org.eclipse.xtext.util.formallang.PdaUtil.filterEdges(PdaUtil.java:451)
at org.eclipse.xtext.serializer.analysis.ContextTypePDAProvider.createPDA(ContextTypePDAProvider.java:178)
at org.eclipse.xtext.serializer.analysis.ContextTypePDAProvider.getContextTypePDA(ContextTypePDAProvider.java:188)
at org.eclipse.xtext.serializer.analysis.SyntacticSequencerPDAProvider.getPDA(SyntacticSequencerPDAProvider.java:604)
at org.eclipse.xtext.generator.serializer.SyntacticSequencerUtil.getAllPDAs(SyntacticSequencerUtil.java:59)
at org.eclipse.xtext.generator.serializer.SyntacticSequencerUtil.getAllAmbiguousTransitions(SyntacticSequencerUtil.java:79)
at org.eclipse.xtext.generator.serializer.SyntacticSequencerUtil.getAllAmbiguousTransitionsBySyntax(SyntacticSequencerUtil.java:90)
at org.eclipse.xtext.generator.serializer.AbstractSyntacticSequencer.getFileContents(AbstractSyntacticSequencer.java:95)
at org.eclipse.xtext.generator.serializer.SerializerFragment.generate(SerializerFragment.java:97)
at org.eclipse.xtext.generator.Xtend2GeneratorFragment.generate(Xtend2GeneratorFragment.java:66)
at org.eclipse.xtext.generator.Xtend2GeneratorFragment.generate(Xtend2GeneratorFragment.java:59)
at org.eclipse.xtext.generator.CompositeGeneratorFragment.generate(CompositeGeneratorFragment.java:92)
at org.eclipse.xtext.generator.LanguageConfig.generate(LanguageConfig.java:113)
at org.eclipse.xtext.generator.Generator.generate(Generator.java:361)
at org.eclipse.xtext.generator.Generator.invokeInternal(Generator.java:128)
at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126)
at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201)
at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:35)
at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:74)
at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35)
我在Eclipse中检查了该操作的启动设置,并在此之前发现它是-Xmx512m
。我试图增加这个数字,但它所做的只是,现在的行动需要更多的时间,然后再撞上同样的错误。我一路走到了-Xmx3000m
-不想在我的4Gb机器上尝试更多。
我想强调的是,我所做的就是创建一个新的XText项目并修改默认的"Hello!“语法由200行语法定义我自己。我的语法编译得很好,没有警告或错误。是什么导致了这个内存错误,以及如何修复它?
我已经找到了这篇相关的博客文章,但是我承认这里的修正已经超出了我的水平,我不知道我到底需要做什么,也不知道它是否能解决问题。
发布于 2012-07-19 10:23:13
我终于缩小了问题的范围:
Datatype:
Rule1 '=' Rule2 Rule3 INT Rule4 etc etc...
在内存不足的情况下失败;
Datatype:
name=Rule1 '=' Rule2 Rule3 INT Rule4 etc etc...
即使使用原始的-Xmx512m
,工作也很好。唯一的区别是将一个name
分配给其中一个规则。我没有意识到命名规则是如此重要,我认为如果我只关心语法正确的DSL文件,并且不打算进一步处理它们,我认为这是可以跳过的,但我想我错了……
https://stackoverflow.com/questions/11555380
复制相似问题