Множественные возвращаемые значения в 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(запрос)
Итак, все хорошо!
В любом случае, спасибо за поиск!