gpt4 book ai didi

java - 在 Xtend 循环中使用唯一的变量名称(代码生成)

转载 作者:行者123 更新时间:2023-12-01 12:03:58 24 4
gpt4 key购买 nike

我使用 Xtext 创建了一个自定义 DSL,它对于描述层次结构很有用(在本例中固定高度为 2)。我现在想做的是生成一个简单的 Java Swing 应用程序,可以使用 JTree 显示这样的层次结构。我通过使用 Xtend 从 Xtext 扩展代码生成示例来做到这一点。一切工作正常,但还可以做得更好。

到目前为止,我的模板部分相当丑陋:

def compile(Level a) '''
DefaultMutableTreeNode «a.name» = new DefaultMutableTreeNode("«a.name»");
«FOR b:a.sublevels»
DefaultMutableTreeNode «b.name» = new DefaultMutableTreeNode("«b.name»");
«a.name».add(«b.name»);
«ENDFOR»
'''

正如您所看到的,我使用 DSL 用户定义的实体名称作为代码生成的变量名称,这很糟糕。如果用户选择的名称不是 Java 中的有效变量名称,则应用程序稍后将无法编译。

我这样做的原因是因为在创建 JTree 及其节点时,我需要唯一的变量名称。生成的代码如下所示:

DefaultMutableTreeNode a = new DefaultMutableTreeNode("a");
DefaultMutableTreeNode a1 = new DefaultMutableTreeNode("a1");
a.add(a1);
DefaultMutableTreeNode a2 = new DefaultMutableTreeNode("a2");
a.add(a2);
DefaultMutableTreeNode a3 = new DefaultMutableTreeNode("a2");
a.add(a3);
...

由于所有内容都在同一范围内,因此变量名称需要不同 - 本例中为 a、a1、a2 和 a3。但是我如何创建有效的唯一变量名称而不是使用用户的输入(这可能是无效的)?如有任何帮助,我们将不胜感激,谢谢。

最佳答案

您需要节点的人工变量名称和计数器变量。最简单的方法是将其作为字段添加到生成器中,并在调用编译方法之前重置它。

int count

def compile(Level a) {
count = 0
return compile(a, -1)
}

def compile(Level a, int parentCount) {
var aCount = count++
return '''
DefaultMutableTreeNode node«aCount» = new DefaultMutableTreeNode("«a.name»");
«IF parentCount > -1»
node«parentCount».add(node«aCount»);
«ENDIF»
«FOR b:a.sublevels»
«compile(b, aCount)»
«ENDFOR»
'''
}

如果您可以节省变量名称,我更喜欢使用 Java 鲜为人知的非静态初始化程序生成代码,因为它们反射(reflect)了 Java 代码中树的结构,例如

new DefaultMutableTreeNode("a") {{
add(new DefaultMutableTreeNode("a1") {{
add(new DefaultMutableTreeNode("b1"))
}})
add(new DefaultMutableTreeNode("a2"))
add(new DefaultMutableTreeNode("a2"))
}}

通过非常简单的生成器

def CharSequence compile(Level a) '''
new DefaultMutableTreeNode("«a.name»")«IF !a.sublevels.empty» {{
«FOR b:a.sublevels»
add(«compile(b)»);
«ENDFOR»
}}«ENDIF»'''

关于java - 在 Xtend 循环中使用唯一的变量名称(代码生成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27798916/

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