несколько возвращаемых значений в ANTLR

Я использую 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?

Заранее большое спасибо, Димос.


person dimstamat    schedule 05.03.2013    source источник


Ответы (1)


Что ж, проблема решена. Я просто добавил ArrayList в правило БД следующим образом:

db [запросы ArrayList] : 'БД' ....

а затем в правиле запроса:

$db::queries.add(запрос)

Итак, все в порядке!

В любом случае, спасибо, что заглянули!

person dimstamat    schedule 05.03.2013