ANTLR4在解析树中检查节点的父节点

时间:2013-05-27 10:53:27

标签: antlr4

当访问者处理我的ANTLR4解析树时,有时我需要知道我的规则节点所在的父规则节点。在ParserRuleContext的在线API文档中,我找不到可以返回对象所代表的规则名称的方法/字段。我知道规则名称是ParserRuleContext的子类名称的一部分,例如function_definition规则节点是类Function_definitionContext。但是要查询类名,我需要使用Java反射并在最后手动对Context字符串进行条带化。

是否有更简单的方法来检索ParserRuleContext对象所代表的规则名称?

查询父规则节点的名称是一种常见的要求。例如,在处理C ++语法时,C ++类声明可以在全局范围,函数定义或其他类声明中,这意味着规则节点class_declaration可以嵌套在global_scope下,{{ 1}}或function_definition规则节点。如果我只想隔离class_declaration下的class_declaration个节点,我需要查找父节点并确保它们不是global_scopefunction_definition。< / p>

1 个答案:

答案 0 :(得分:3)

要将ParserRuleContext中的规则名称作为字符串获取,您可以执行以下操作:

String[] ruleNames = parser.getRuleNames();
String ruleName = ruleNames[parserRuleContext.getRuleIndex()];

您还可以将规则索引与生成的常量进行比较:

boolean isClassDeclaration =
    parserRuleContext.getRuleIndex() == MyParser.RULE_class_declaration;