Я пытаюсь написать сценарий antlr, в котором в правиле1 есть подправило, правило2. Я использую StringTemplate по правилу 1.
Что я хочу сделать, так это реструктурировать текст, соответствующий правилу2, прежде чем он будет использован/использован правилом1. Как мне это сделать ?
options{
output=template;
}
rule1 :
begin sub-rule2 end ';' -> meth(body={rule1.text})
sub-rule2 :
sub-rule3
| sub-rule4
| sub-rule5;
здесь "мет" - это вызов шаблона строки
Если, скажем, подправило 4 соответствует «выбрать * из двойного;», я бы хотел, чтобы это было передано в правило 1 «#sql (выбрать * из двойного);».
Вот мой фактический код. Я хотел бы, чтобы операторы, соответствующие правилу select_statement, были заключены в «#sql()» и переданы в списке «статистика» в атрибут «body» шаблона «meth»:
body
@init {
List stats = new ArrayList();
} :
BEGIN s=statement{ stats.add($s.text); } SEMI ( s=statement{ stats.add($s.text); } SEMI | pragma SEMI )*
( EXCEPTION exception_handler+ )? END ID? -> method(modifiers={"public"},returnType={"void"},name={"execute"},body={stats})
;
statement :
label*
( assign_or_call_statement
| case_statement
| close_statement
| continue_statement
| basic_loop_statement
| execute_immediate_statement
| exit_statement
| fetch_statement
| for_loop_statement
| forall_statement
| goto_statement
| if_statement
| null_statement
| open_statement
| plsql_block
| raise_statement
| return_statement
| sql_statement
| while_loop_statement
)
;
sql_statement
: (commit_statement
| delete_statement
| insert_statement
| lock_table_statement
| rollback_statement
| savepoint_statement
| select_statement
| set_transaction_statement
| update_statement )
;
select_statement :
SELECT swallow_to_semi
;
SELECT : 'select';
swallow_to_semi :
~( SEMI )+
;