如何修复StringTempate4错误:context将2个args传递给带有1个声明arg的模板

时间:2014-02-22 00:03:11

标签: stringtemplate-4

以下是StringTemplate4的修改测试,它给出了一个错误:

#!/usr/bin/env groovy

@Grab(group="org.antlr", module="ST4", version="4.0.7")
import org.stringtemplate.v4.ST
import org.stringtemplate.v4.STGroup
import org.stringtemplate.v4.STGroupString

class Decl {
  def name
  def type
  Decl(name, type) {
    this.name = name
    this.type = type
  }
}
String templates =
  "file(variables) ::= <<\n" +
  "<variables:{ v | <v:decl(v)>}; separator=\"\\n\">\n"+
  ">>\n"+
  "decl(v) ::= \"<v.type> <v.name> = 0;\"";
STGroup group = new STGroupString(templates);
ST f = group.getInstanceOf("file");
f.addAggr("variables.{decl}", ["a", "int"] as Decl);
f.addAggr("variables.{decl}", ["b", "int"] as Decl);
println(f.render())

这是错误:

context [/file /_sub1] 1:20 passed 2 arg(s) to template /decl with 1 declared arg(s)
context [/file /_sub1] 1:20 passed 2 arg(s) to template /decl with 1 declared arg(s)

似乎“v”在某处扩展但我不清楚如何,所以我不明白错误。编写此代码的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

这看起来像是对地图运算符的错误使用,因为variables中的每个项目都是Decl的单个实例。您无需将v映射到decl,只需调用decl,如下所示。

<variables:{ v | <decl(v)>}; separator="\n">

但是,由于您使用的是addAggr而不是add,因此您还需要传递正确的属性。

<variables:{ v | <decl(v.decl)>}; separator="\n">