Я использую ANTLR4 с Java и хотел бы сохранить значения, возвращаемые правилом при анализе ввода. Я использую такую грамматику:
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 содержит только последний запрос. Я решил эту проблему, поддерживая глобальные списки массивов, в которых хранятся запросы. Но есть ли другой способ сделать это с ANTLR, пока правила возвращаются, и не иметь моих собственных глобальных ArrayLists?
Заранее большое спасибо, Димос.