Java で ANTLR4 を使用しており、入力の解析中にルールが返す値を保存したいと考えています。私は次のような文法を使用します。
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 サイズ) は常に 1 です。これは、入力時に QUERY 要素が認識されるたびに $qs ArrayList に追加されるためですが、他の QUERY ごとに新しい ArrayList がインスタンス化され、このクエリがこの新しい ArrayList に追加されるためです。すべてのクエリが認識されると、 db : ルールのアクションが呼び出されますが、$query.qs ArrayList には最後のクエリしかありません。クエリを格納するグローバル ArrayLists を維持することで、この問題を解決しました。しかし、ルールが戻ってきて、独自のグローバルArrayListsを持っていない間に、ANTLRでそれを行う別の方法はありますか?
前もって感謝します、Dimos。