1

我正在使用 Antlr 4 RC1(完整的 jar)来解析语法,构建自定义 ast,并使用 stringtemplate4 从该 AST 生成代码(我使用 antlr jar 中的 stringtemplate 类)。在模板中,我调用另一个带有 bean 列表的模板,例如

<subtemplate(myListArg=parm.listOfBeans)>

然后在子模板中我得到一个字符串列表(每个字符串都是评估为字符串的 bean 之一)。但我需要的是 java bean 的列表(例如带有属性的简单 java 对象),因为我想处理 bean 的属性而不是 bean 的值,例如

<subtemplate(myListArg)> ::= <<
  <myListArg: {x | {... <x.someProperty> ...}>
>>

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

4

1 回答 1

2

StringTemplate 4 在调用子模板时不会呈现数组的成员或List字符串,如下所示。编辑:尽管在这篇文章的评论中有相反的说法,但我重申 ST4在调用子模板时不会呈现数组的成员 List字符串。存储在数组或列表中的元素类型没有区别

start(class) ::= <<
<fields(class.fields)>
>>

fields(fieldsArray) ::= <<
<fieldsArray:{field | <field.name>}; separator="\n">
>>

如果您创建start模板实例并传递参数,您Integer.classclass获得以下输出:

MIN_VALUE
MAX_VALUE
TYPE
SIZE

您的应用程序中必须出现以下情况之一:

  1. myListArg实际上不是字符串列表(即您得到了意外的输出,但不是出于此处列出的原因)
  2. ModelAdaptor注册了一个类型,该类型parm正在返回该属性的字符串列表listOfBeans
  3. 的类型parm有一个getListOfBeans返回字符串列表的方法
  4. 项 (3) 不成立,并且类型parm有一个 listOfBeans 字段,它是一个字符串列表

编辑:关于列表与数组的问题,我执行了上面的单元测试并传递new Clazz(Integer.class)而不是仅仅传递Integer.classstart模板:

private static class Clazz {
    private final Class<?> clazz;

    public Clazz(Class<?> clazz) {
        this.clazz = clazz;
    }

    public List<Field> getFields() {
        return Arrays.asList(clazz.getFields());
    }
}
于 2013-01-20T13:10:17.613 回答