Вы можете конкретно определить, что правило может возвращать так:
sub_rule2 returns [String x]
: sub_rule3 {$x = ... }
| sub_rule4 {$x = "#sql (" + $sub_rule4.text + ");";}
| sub_rule5 {$x = ... }
;
Теперь sub_rule2
возвращает String x
, который вы можете использовать следующим образом:
rule1
: ... sub_rule2 ... -> meth(body={sub_rule2.x})
;
Обратите внимание на sub_rule2.x
.
EDIT
Вы также можете создать собственный метод, который проверяет, начинается ли текст, добавляемый в List
, с "select "
, например:
grammar YourGrammarName;
options{
output=template;
}
@parser::members {
private void addStat(String stat, List<String statList>) {
// 1. if `stat` starts with "select ", wrap "#sql(...)" around it.
// 2. add `stat` to `statList`
}
}
body
@init {
List<String> stats = new ArrayList<String>();
}
: BEGIN s=statement { addStat($s.text, stats); } SEMI
( s=statement { addStat($s.text, stats); } SEMI
| pragma SEMI
)*
(EXCEPTION exception_handler+)? END ID?
-> method(modifiers={"public"},returnType={"void"},name={"execute"},body={stats})
;