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

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

1 ответ

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

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

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

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

Итак, все хорошо!

В любом случае, спасибо за поиск!

Другие вопросы по тегам