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>>
:
¹:只要某些终端(如'<'或'>')在递归停止时可以区分即可。
生成
我需要知道如何表达如下语句:
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>>
:
¹:只要某些终端(如'<'或'>')在递归停止时可以区分即可。
生成