Scheme的半引号的ANTLR语法

|| 考虑以下EBNF中的语法: http://pauillac.inria.fr/cdrom_a_graver/www/bigloo/manual/r5rs-8.html 给定的准引用语法不是上下文无关的:
<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>) 
尽管它是为上下文无关的语法设计的,但是否可以在ANTLR中为此定义语法?     
已邀请:
        您可以在词法分析器规则和解析器规则中添加参数
[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] \')\'
  ;
注意,还有一些语法谓词“ѭ8”来说明语法中的一些歧义。 有关ANTLR中R5RS规范的完整版本,请参见此答案。     

要回复问题请先登录注册