深层复制string-template3属性?

时间:2013-12-22 06:04:02

标签: antlr stringtemplate

我对stringtemplate非常陌生,并且正在为语言翻译项目进行实验。

无论如何,我已经定义了一个包含以下模板的Java组文件:

instantiation(realization, arguments) ::= 
<<new <realization>(<arguments; separator = ", ">)>>

但是,我正在努力解决以下问题:

private StringTemplate myCurTemplate;

public void foo() {
    myCurTemplate = myGroups.getInstanceOf("instantiation");
    myCurTemplate.setAttribute("realization", "test");
    myCurTemplate.setAttribute("arguments", "p0");
    myCurTemplate.setAttribute("arguments", "p1");

    System.out.println("Starting: " + myCurTemplate);  // "new test(p0, p1)"
}

public void bar() {
    StringTemplate modified = myGroups.getInstanceOf("instantiation");
    modified.setAttribute("realization", "anotherTest");
    modified.setAttribute("arguments", myCurTemplate.getAttribute("arguments"));

    System.out.println("Modified: " + modified);  // "new anotherTest(p0, p1)"

    modified.setAttribute("arguments", "p2");
    System.out.println("Modified: " + modified);  // as expected, "new anotherTest(p0, p1, p2)"
    System.out.println("Original: " + myCurTemplate); // "new test(p0, p1, p2)"
}

注意添加&#34; p2&#34;到模板,&#34;修改&#34;,它也改变&#34; myCurTemplate&#34; ... 也许我设计的模板不正确(或不充分?),但是有一些方法可以做到这一点,而无需修改原版&#34; myCurTemplate&#34; ??

也就是说,我可以以某种方式制作myCurTemplate&#34; s&#34;#34;的真实副本。属性没有被未来添加到其他模板实例修改?我没有太多运气就查看了这些方法和api文档 - 我有一种感觉,我只是尝试做一些通常不会做的事情,或者需要使用stringtemplate。

修改 所以我在ST4中对此进行了一些处理,并想出了这段代码:

ST x = myGroups.getInstanceOf("instantiation");
x.add("realization", "Realiz");
x.add("arguments", "p0");
x.add("arguments", "p1");

ST y = new ST(x);
y.remove("realization"); 
y.add("realization", "Another");
y.add("arguments", "p6");

print x.render(); // "new Realiz(p0, p1, p6)"
print y.render(); // "new Another(p0, p1, p6)"   

我可以毫无困难地修改&#34;实现属性,但是仍然会遇到长度为&gt;的参数列表的问题。 1.例如,如果我将x中的参数列表定义为仅一个元素,那么在y中修改它将两者分开 - 根据需要(可能因为它们在复制时都得到一个单独的引用?)例如:

ST x = myGroups.getInstanceOf("instantiation");
x.add("realization", "Realiz");
x.add("arguments", "p0");

ST y = new ST(x);
y.remove("realization"); 
y.add("realization", "Another");
y.add("arguments", "p6");
y.add("arguments", "p3");

print x.render();  // "new Realiz(p0)"
print y.render();  // "new Realiz(p0, p6, p3)"   (like I would expect)

1 个答案:

答案 0 :(得分:0)

(按现在我假设你的意思是myCurTemplate)。嗯......似乎我没有在getAttribute()中复制,也没有警告你不要修改。所以...不要修改它。 ;)它正在从myCurTemplate中提取支持列表并推送到修改过的。首先克隆这些元素。