我使用Antlr 4 RC1(完整的jar)解析语法,构建自定义ast,并使用stringtemplate4从AST生成代码(我使用antlr jar中的stringtemplate类)。 在模板内部,我调用另一个带有bean列表的模板,例如。
<subtemplate(myListArg=parm.listOfBeans)>
然后在subtemplate中我得到一个字符串列表(每个字符串是一个被评估为String的bean)。但我需要的是java bean列表(例如带有属性的简单java对象),因为我想处理bean的属性而不是bean的值,例如。
<subtemplate(myListArg)> ::= <<
<myListArg: {x | {... <x.someProperty> ...}>
>>
在我看来,模板的参数总是被评估为字符串。这是预期的行为吗?如果是,我应该写什么?
答案 0 :(得分:2)
StringTemplate 4在调用子模板时不会将数组成员或List
呈现为字符串,如下所示。 编辑:尽管在这篇文章的评论中声称相反,但我重申ST4 不呈现数组的成员或 {{ 1}}调用子模板时的字符串。存储在数组或列表中的元素类型使没有区别。
List
如果您创建start(class) ::= <<
<fields(class.fields)>
>>
fields(fieldsArray) ::= <<
<fieldsArray:{field | <field.name>}; separator="\n">
>>
模板的实例并为start
参数传递Integer.class
,则会得到以下输出:
class
您的申请必须出现以下情况之一:
MIN_VALUE
MAX_VALUE
TYPE
SIZE
实际上并不是字符串列表(即您获得了意外的输出,但不是出于此处列出的原因)myListArg
类型ModelAdaptor
正在返回属性parm
的字符串列表listOfBeans
的类型具有parm
方法,该方法返回字符串列表getListOfBeans
的类型有listOfBeans字段,这是字符串列表编辑:关于列表与数组的问题,我执行了上面的单元测试,将parm
而非new Clazz(Integer.class)
传递到Integer.class
模板:
start