ANTLR 如何使用递归检索令牌的类型
ANTLR how to retrieve the type of token with recursion
我正在使用 ANTLR4 框架,这是我的语言片段:
r
: RN #RNName
| 'DLRRelationIntersectionOf' LPAREN r COMMA r RPAREN #RIntersection
| 'DLRRelationUnionOf' LPAREN r COMMA r RPAREN #RUnion
如您所见,RN 是一个终端节点,因此我可以轻松处理它。但是 r 是非终端节点,因此它可能非常复杂,例如 DLRRelationUnionOf(RN1, DLRRelationIntersectionOf(RN2,RN3))。
我的目标是处理r节点,递归寻找RN。
问题是,一旦在代码中检索规则 r,例如:
DLRParser.RContext recursiveRule = ctx.r();
我如何查看 recursiveRule 以找出 RN?
在其 运行 期间,解析器创建一个解析树(如果启用,这是默认设置)。解析树是匹配项的树表示。这棵树由 ParserRuleContext
个实例组成,每个实例都有子项,这些子项按匹配顺序表示该规则中的匹配项。因此,对于您的 r
上下文,当匹配第二个 alt 时,您可以找到 6 个子节点(一个用于文字,一个用于 LPAREN,一个用于第一个子 r
等)。您可以使用这些子上下文来访问子条目。如果 RN
匹配,则您在第一个子条目中有一个终端节点。
我正在使用 ANTLR4 框架,这是我的语言片段:
r
: RN #RNName
| 'DLRRelationIntersectionOf' LPAREN r COMMA r RPAREN #RIntersection
| 'DLRRelationUnionOf' LPAREN r COMMA r RPAREN #RUnion
如您所见,RN 是一个终端节点,因此我可以轻松处理它。但是 r 是非终端节点,因此它可能非常复杂,例如 DLRRelationUnionOf(RN1, DLRRelationIntersectionOf(RN2,RN3))。 我的目标是处理r节点,递归寻找RN。 问题是,一旦在代码中检索规则 r,例如:
DLRParser.RContext recursiveRule = ctx.r();
我如何查看 recursiveRule 以找出 RN?
在其 运行 期间,解析器创建一个解析树(如果启用,这是默认设置)。解析树是匹配项的树表示。这棵树由 ParserRuleContext
个实例组成,每个实例都有子项,这些子项按匹配顺序表示该规则中的匹配项。因此,对于您的 r
上下文,当匹配第二个 alt 时,您可以找到 6 个子节点(一个用于文字,一个用于 LPAREN,一个用于第一个子 r
等)。您可以使用这些子上下文来访问子条目。如果 RN
匹配,则您在第一个子条目中有一个终端节点。