2016-11-10 96 views
0

我使用的是ANTLR4框架,这是我的语言的片段检索标记的类型:ANTLR如何使用递归

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。 的问题是,一旦在类似的代码retrive规则R:

DLRParser.RContext recursiveRule = ctx.r(); 

我怎么能看着recursiveRule找出问题的RN?

回答

1

在运行过程中,解析器会创建一个解析树(如果启用,这是默认设置)。分析树是匹配项目的树形表示。该树由ParserRuleContext个实例组成,每个实例都具有子代表,该子代表匹配顺序中该规则中的匹配项目。因此,对于您的r上下文,匹配第二个alt时,可以找到6个子节点(一个用于文字,一个用于LPAREN,一个用于第一个子r等)。您可以使用这些子上下文访问子条目。如果匹配RN,则在第一个子项中有一个终端节点。