Antlr Stringtemplate模板参数始终计算为字符串
我正在使用AntlR4RC1(完整的jar)解析语法,构建自定义ast,并使用stringtemplate4从该ast生成代码(我在AntlRJAR中使用stringtemplate类)。 在一个模板中,我调用另一个带有bean列表的模板Antlr Stringtemplate模板参数始终计算为字符串,antlr,stringtemplate,antlr4,Antlr,Stringtemplate,Antlr4,我正在使用AntlR4RC1(完整的jar)解析语法,构建自定义ast,并使用stringtemplate4从该ast生成代码(我在AntlRJAR中使用stringtemplate类)。 在一个模板中,我调用另一个带有bean列表的模板 <subtemplate(myListArg=parm.listOfBeans)> 然后在子模板中,我得到一个字符串列表(每个字符串都是一个计算为字符串的bean)。但是我需要的是java bean的列表(例如带有属性的简单java对象),因
<subtemplate(myListArg=parm.listOfBeans)>
然后在子模板中,我得到一个字符串列表(每个字符串都是一个计算为字符串的bean)。但是我需要的是java bean的列表(例如带有属性的简单java对象),因为我想要处理bean的属性,而不是bean的值,例如
<subtemplate(myListArg)> ::= <<
<myListArg: {x | {... <x.someProperty> ...}>
>>
:=>
在我看来,模板的参数总是计算为字符串。这是故意的行为吗?如果是,我还应该写什么?StringTemplate 4在调用子模板时不会将数组或列表的成员呈现为字符串,如下所示Edit:尽管在这篇文章的评论中有相反的说法,我重申ST4在调用子模板时不会将数组或列表的成员呈现为字符串。数组或列表中存储的元素类型没有区别 应用程序中必须出现以下情况之一:
myListArg
实际上不是字符串列表(即,您将获得意外的输出,但并非出于此处列出的原因)parm
类型注册了一个modeldadapter
,它将返回属性listobeans
parm
的类型有一个getListOfBeans
方法,该方法返回字符串列表parm
的类型有一个listOfBeans字段,它是一个字符串列表newclazz(Integer.class)
而不是Integer.class
传递到start
模板:
private static class Clazz {
private final Class<?> clazz;
public Clazz(Class<?> clazz) {
this.clazz = clazz;
}
public List<Field> getFields() {
return Arrays.asList(clazz.getFields());
}
}
私有静态类Clazz{
私人期末班;
公共课(班级课){
this.clazz=clazz;
}
公共列表getFields(){
返回Arrays.asList(clazz.getFields());
}
}
非常感谢。这对我很有帮助。class.fields的类型为字段[]
。在我的例子中,myListArg的类型是java.util.List
。我把myListArg转换成了一个数组,它成功了。我不知道stringtemplate是否打算以不同的方式处理数组和列表作为参数,但至少现在我有了一个解决方法。要么将所有列表转换为数组,要么添加一个额外的数组字段。再次感谢你的帮助。我发现了更多。数组中的类型是转换为字符串还是按原样转换,取决于该类型实现的toString()。因此,如果您想知道为什么在这样的代码中,模板的参数是字符串,请尝试删除javabean的toString()方法。我编辑了我的答案,以澄清我在数组和列表
接口上执行此测试的结果是相同的。我还使用实现了toString
的字段包装器执行了测试。我还对答案进行了编辑,以澄清上述评论具有误导性,并且包含不正确的信息。
MIN_VALUE
MAX_VALUE
TYPE
SIZE
private static class Clazz {
private final Class<?> clazz;
public Clazz(Class<?> clazz) {
this.clazz = clazz;
}
public List<Field> getFields() {
return Arrays.asList(clazz.getFields());
}
}