Вы можете добавить параметры к правилам как лексера, так и парсера, добавив после него [int d]
, например: foo[int d] : ... ;
.Передать параметр 1
в правило foo
так же просто, как parse : foo[1];
:
Конечно, это не обязательно должен быть int
, но может быть любой тип.
Так, в вашем случае, сделайте что-то вроде этого:
quasiquotation
: quasiquotationD[1]
;
quasiquotationD[int d]
: '`' qqTemplate[d]
| '(' QUASIQUOTE qqTemplate[d] ')'
;
qqTemplate[int d]
: (expression)=> expression
| ('(' UNQUOTE)=> unquotation[d]
| simpleDatum
| vectorQQTemplate[d]
| listQQTemplate[d]
;
vectorQQTemplate[int d]
: '#(' qqTemplateOrSplice[d]* ')'
;
listQQTemplate[int d]
: '\'' qqTemplate[d]
| ('(' QUASIQUOTE)=> quasiquotationD[d+1]
| '(' (qqTemplateOrSplice[d]+ ('.' qqTemplate[d])?)? ')'
;
unquotation[int d]
: ',' qqTemplate[d-1]
| '(' UNQUOTE qqTemplate[d-1] ')'
;
qqTemplateOrSplice[int d]
: ('(' UNQUOTE_SPLICING)=> splicingUnquotation[d]
| qqTemplate[d]
;
splicingUnquotation[int d]
: ',@' qqTemplate[d-1]
| '(' UNQUOTE_SPLICING qqTemplate[d-1] ')'
;
Обратите внимание, что есть также некоторые синтаксические предикаты, ( ... )=>
, для объяснения некоторых неясностей в грамматике.
Для полноговерсия спецификации R5RS в ANTLR, см. этот ответ .