2011-11-29 52 views
1

我的.stg文件中有兩個模板,並且它們都適用於 多值HashMap。 HashMap被用作注入對象。Stringtemplate:應用HashMap使用的模板是否可行,對於多值屬性

我需要的HashMap的那些實例可以被注射多次。

我的麻煩是,當我切換到另一個模板時,ANTLR好像將 考慮爲第二個HashMap作爲List - multipul對象並且爲null 值。我.G文件


Part of my .stg file shows as follows: 

tpl_hash(BAR, FOO) ::= << 
<FOO:foo(); separator="\n"> 
<BAR:bar(); separator="\n"> 
>> 

foo(nn) ::= << 
foo: <nn.name; null="NULL"> . <nn.national; null="NULL"> 
>> 


bar(mm) ::= << 
bar: <mm.name> @ <mm.national> 
>> 

部分顯示:

HashMap hm = new HashMap(); 
hm.put("name", $name.text); 
hm.put("national", "German"); 
tpl_hash.add("FOO",new HashMap(hm)); 
HashMap hm2 = new HashMap(); 
hm2.put("name", $name.text); 
hm2.put("national", "German"); 
tpl_hash.add("BAR",new HashMap(hm2)); 

我希望得到的結果是:

bar: Kant @ German 
foo: Russell @ England 

但是,我得到:

foo: NULL . NULL 
foo: NULL . NULL 
bar: @ 
bar: @ 

如果我們FOO更換BAR,按原樣保持FOO和BAR具有相同 模板,輸出是正確的,像下面這樣。

bar: Russell @ German 
bar: Russell @ German 

在文檔, 「同步ST中 添加(字符串名稱,對象的值)org.stringtemplate.v4.ST」 說:

「如果你在一個列表發送,然後注入單個值元素add() 複製原始列表並添加新值。「

約一個HashMap

什麼? StringTemplate是否考慮將HashMap,鍵/值對 作爲一個對象故意作爲List和多值注入的 錯誤?

+0

您標記並提到了ANTLR,但我沒有看到有關ANTLR的問題(僅StringTemplate)。我爲此刪除了ANTLR標籤,並用「StringTemplate」替換了「ANTLR」。如果我錯了,你可以回到原來的問題,但請編輯問題以明確ANTLR問題。 –

回答

1

你的問題是,你可以在地圖上,而不是地圖本身施加富/酒吧模板每個項目。

考慮下面的數據結構:

{ 
    "FOO": { 
    "name": "Nick", 
    "national":"German" 
    }, 
    "BAR": { 
    "name": "Karl", 
    "national":"French" 
    }, 
    "FIZZBUZZ": [ 
    { 
     "name": "Kitty", 
     "national":"English" 
    }, 
    { 
     "name": "Dan", 
     "national":"Finnish" 
    } 
    ] 
} 

(試想一下,你已經設置FOO是生成的地圖,FIZZBUZZ等)。

,想象下面的模板:

group blank; 
main()::=<< 
$foo(nn=FOO)$ 
$bar(mm=BAR)$ 

$! This is wrong because it applies foo to each element of the map!$ 
$FOO:foo(); separator = "\n"$ 

$! This is right because each element of baz is itself a map! !$ 
$FIZZBUZZ:foo(); separator = "\n"$ 
$FIZZBUZZ:bar(); separator = "\n"$ 
>> 

foo(nn) ::= << 
foo: $nn.name; null="NULL"$ . $nn.national; null="NULL"$ 
>> 


bar(mm) ::= << 
bar: $mm.name$ @ $mm.national$ 
>> 

您將得到以下輸出:

foo: Nick . German 
bar: Karl @ French 

foo: NULL . NULL 
foo: NULL . NULL 

foo: Kitty . English 
foo: Dan . Finnish 
bar: Kitty @ English 
bar: Dan @ Finnish 

所以只要改變你的電話從FOO:foo()到我用foo(nn=FOO)

小StringTemplate的應用我開發的引擎項目(http://stringtemplate.appspot.com/)來測試這個;它不是使用4.0版本,而是3.2版本,但它應該非常相似。

相關問題