2013-03-05 4 views
1

Java에서 ANTLR4를 사용하고 입력을 구문 분석하는 동안 규칙이 반환하는 값을 저장하고 싶습니다. 나는이 같은 문법을 사용ANTLR의 다중 반환 값

db : 'DB' '(' 'ID' '=' ID ',' query* ')' 
{ 
System.out.println("creating db"); 
System.out.println("Number of queries -> "+$query.qs.size()); 
} 
; 

query returns [ArrayList<Query> qs] 
@init 
{ 
    $qs = new ArrayList<Query>(); 
} 
: 'QUERY' '(' 'ID' '=' ID ',' smth ')' 
{ 
System.out.println("creating query with id "+$ID.text); 
Query query = new Query(); 
query.setId($ID.text); 
$qs.add(query); 
} 
; 

을하지만 무슨 일 인쇄 쿼리 ($ query.qs 크기)의 수는 항상 한 것입니다. 이는 QUERY 요소가 입력시 인식 될 때마다 $ qs ArrayList에 추가 될 것이지만 서로 다른 QUERY에 대해 새 ArrayList가 인스턴스화되고이 쿼리가이 새 ArrayList에 추가되기 때문에 이런 일이 발생합니다. 모든 쿼리가 인식되면 db : 규칙에 대한 작업이 호출되지만 $ query.qs ArrayList에는 마지막 쿼리 만 있습니다. 필자는 쿼리를 저장하는 전역 ArrayLists를 유지 관리하여이 문제를 해결했습니다. 그러나 규칙이 반환되는 동안 ANTLR로 그것을 수행하는 또 다른 방법이 있으며 내 자신의 전역 ArrayLists가 없는가?

미리 감사드립니다. Dimos.

답변

1

글쎄, 문제가 해결되었습니다.

dB [ArrayList를 쿼리] : 'DB'....

다음 쿼리 규칙에서 :

$ DB :: queries.add을 난 그냥이 같은 DB 규칙에 ArrayList에 추가 (쿼리)

그래서 모든 것이 좋습니다!

어쨌든 찾아 주셔서 감사합니다.