Stringtemplate模板参数始终计算为字符串

时间:2013-01-20 12:24:08

标签: antlr stringtemplate antlr4

我使用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> ...}>
>>

在我看来,模板的参数总是被评估为字符串。这是预期的行为吗?如果是,我应该写什么?

1 个答案:

答案 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

您的申请必须出现以下情况之一:

  1. MIN_VALUE MAX_VALUE TYPE SIZE 实际上并不是字符串列表(即您获得了意外的输出,但不是出于此处列出的原因)
  2. 您注册的myListArg类型ModelAdaptor正在返回属性parm的字符串列表
  3. listOfBeans的类型具有parm方法,该方法返回字符串列表
  4. 项目(3)不成立,getListOfBeans的类型有listOfBeans字段,这是字符串列表
  5. 编辑:关于列表与数组的问题,我执行了上面的单元测试,将parm而非new Clazz(Integer.class)传递到Integer.class模板:

    start