2011-11-29 5 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와 BAR를 교체하는 경우, 그대로, 동일한 템플릿으로 FOO와 BAR를 유지, 출력은 다음과 같은 권리

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

. "ST는 에 org.stringtemplate.v4.ST을 (문자열 이름, 개체 값)를 추가 동기화"

bar: Russell @ German 
bar: Russell @ German 
문서에서

는 말했다 : 당신이 목록에 보낼 경우

"주입 한 후 단일 값 요소 인 add() 은 원래 목록을 복사하고 새 값을 추가합니다. "

HashMap은 어떤가요? StringTemplate은 HashMap, 키/값 쌍인 을 의도적으로 액세스하고 목록으로 간주하고 실수로 삽입 된 다중 값을 고려합니까?

+0

ANTLR에 태그를 추가하고 언급했지만 ANTLR에 대한 질문 (StringTemplate 만)이 표시되지 않습니다. 그 때문에 ANTLR 태그를 제거하고 "ANTLR"에 대한 언급을 "StringTemplate"으로 바꿨습니다. 내가 틀렸다면 원래 질문으로 되돌릴 수 있지만 문제를 편집하여 ANTLR 문제가 무엇인지 명확히하십시오. –

답변

1

문제는 맵 자체가 아니라 맵의 각 항목에 foo/bar 템플릿을 적용한다는 것입니다.

는 다음과 같은 데이터 구조를 고려하십시오

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

(당신이 결과지도, FIZZBUZZ 등으로 FOO를 설정 한 것을 상상해보십시오).

그리고 상상 다음 템플릿 :

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 버전이라고 생각합니다. 그러나 매우 유사해야합니다.