ANTLR 中的递归规则

Recursive rule in ANTLR

我需要知道如何表达如下语句:

Int<Double<Float>>

因此,以抽象形式我们应该有:

1.(easiest case):  a<b>
2. case: a<a<b>> 
3. case: a<a<a<b>>>
4. ....and so on...

问题是我应该能够在 < .. > - 符号中嵌入 a < b > 形式的语句,这样我就有了一个嵌套语句。换句话说:我应该用 a< b > 替换 b。 第二件事是打开和关闭 <> 符号的数量应该相等。

我如何在 ANTLR 中做到这一点?

规则可以毫无问题地引用自身¹。假设我们有一条规则 type 以极简主义的方式描述了您的情况:

type: typeLiteral ('<' type '>')?;
typeLiteral: 'Int' | 'Double' | 'Float';

请注意 ('<' type '>') 是可选的,由 ? 符号表示,因此仅使用 typeLiteral 是有效的 type。以下是您示例中这些规则生成的语法树 Int<Double<Float>>:

¹:只要某些终端(如'<'或'>')在递归停止时可以区分即可。

图像由http://ironcreek.net/phpsyntaxtree/

生成