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 匹配,则您在第一个子条目中有一个终端节点。