Scheme';s拟旋转

Scheme';s拟旋转,scheme,antlr,context-free-grammar,r5rs,Scheme,Antlr,Context Free Grammar,R5rs,在EBNF中考虑以下语法: 此处给出的准旋转语法不是上下文无关的: <quasiquotation> --> <quasiquotation 1> <qq template 0> --> <expression> <quasiquotation D> --> `<qq template D> | (quasiquote <qq template D>) <qq templa

在EBNF中考虑以下语法:

此处给出的准旋转语法不是上下文无关的:

<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是为上下文无关的语法而设计的,但它是否可以在ANTLR中为此定义语法?

您可以通过在其后添加
[int d]
来向lexer和parser规则添加参数,如下所示:
foo[int d]:。将参数
1
传递给规则
foo
parse:foo[1]一样简单

当然,它不需要是
int
,但可以是任何类型

因此,在您的情况下,请执行以下操作:

准旋转
:准旋转[1]
;
准旋转[int d]
:“`qqTemplate[d]
|"("准量子模板")"
;
qqTemplate[int d]
:(表达式)=>表达式
|('('UNQUOTE)=>UNQUOTE[d]
|单叶植物
|向量qtTemplate[d]
|listQQTemplate[d]
;
向量qtTemplate[int d]
:“#”(“qqTemplateOrSplice[d]*”)
;
listQQTemplate[int d]
:“\”qqTemplate[d]
|('('quasikote)=>quasikotationd[d+1]
|"("qqTemplate或plice[d]+""qqTemplate[d])"("qqTemplate[d])")"
;
不引用[int d]
:','qqTemplate[d-1]
|“(“取消引用qqTemplate[d-1]”)
;
qqTemplateOrSplice[int d]
:('('UNQUOTE_拼接)=>splicinguquotation[d]
|qqTemplate[d]
;
拼音输入[int d]
:',@'qqTemplate[d-1]
|“(“取消拼接qqTemplate[d-1]”)
;
请注意,还有一些语法谓词,
(…)=>
,用来解释语法中的一些歧义


有关ANTLR中R5RS规范的完整版本,请参见。

您可以通过在其后添加
[int d]
来向lexer和parser规则添加参数,如下所示:
foo[int d]:…;
。将参数
1
传递给rule
foo
解析:foo[1];
一样简单:

当然,它不需要是
int
,但可以是任何类型

因此,在您的情况下,请执行以下操作:

准旋转
:准旋转[1]
;
准旋转[int d]
:“`qqTemplate[d]
|"("准量子模板")"
;
qqTemplate[int d]
:(表达式)=>表达式
|('('UNQUOTE)=>UNQUOTE[d]
|单叶植物
|向量qtTemplate[d]
|listQQTemplate[d]
;
向量qtTemplate[int d]
:“#”(“qqTemplateOrSplice[d]*”)
;
listQQTemplate[int d]
:“\”qqTemplate[d]
|('('quasikote)=>quasikotationd[d+1]
|"("qqTemplate或plice[d]+""qqTemplate[d])"("qqTemplate[d])")"
;
不引用[int d]
:','qqTemplate[d-1]
|“(“取消引用qqTemplate[d-1]”)
;
qqTemplateOrSplice[int d]
:('('UNQUOTE_拼接)=>splicinguquotation[d]
|qqTemplate[d]
;
拼音输入[int d]
:',@'qqTemplate[d-1]
|“(“取消拼接qqTemplate[d-1]”)
;
请注意,还有一些语法谓词,
(…)=>
,用来解释语法中的一些歧义


有关ANTLR中R5RS规范的完整版本,请参阅。

D是一个自然数,定义了抽象的“级别”。它类似于“归纳”构建规则。请参阅,以获得良好的解释和一些示例……D是一个自然数,定义了抽象的“级别”。它类似于“归纳”构建规则。请参阅以获得良好的解释和一些示例。。。