An ANTLR grammar for Scheme's quasiquotations
Considering following grammar in EBNF:
h开发者_StackOverflowttp://pauillac.inria.fr/cdrom_a_graver/www/bigloo/manual/r5rs-8.html
The quasiquotations grammar given there is not context free:
<quasiquotation> --> <quasiquotation 1>
<qq template 0> --> <expression>
<quasiquotation D> --> `<qq template D>
| (quasiquote <qq template D>)
<qq template D> --> <simple datum>
| <list qq template D>
| <vector qq template D>
| <unquotation D>
<list qq template D> --> (<qq template or splice D>*)
| (<qq template or splice D>+ . <qq template D>)
| '<qq template D>
| <quasiquotation D+1>
<vector qq template D> --> #(<qq template or splice D>*)
<unquotation D> --> ,<qq template D-1>
| (unquote <qq template D-1>)
<qq template or splice D> --> <qq template D>
| <splicing unquotation D>
<splicing unquotation D> --> ,@<qq template D-1>
| (unquote-splicing <qq template D-1>)
Is it possible to define a grammar for this in ANTLR, although it is designed for context-free grammars?
You can add parameters to both lexer- and parser rules by adding [int d]
after it, like this: foo[int d] : ... ;
. Passing the parameter 1
to rule foo
is as simple as parse : foo[1];
:
Of course, it need not be an int
, but can be any type.
So, in your case, do something like this:
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] ')'
;
Note that there are also some syntactic predicates, ( ... )=>
, to account for some ambiguities in the grammar.
For a complete version of the R5RS spec in ANTLR, see this answer.
精彩评论