ANTLR4 Проверка родительского узла в дереве синтаксического анализа

При обработке моего дерева синтаксического анализа ANTLR4 посетителем иногда мне нужно знать узлы родительских правил, под которыми находится мой узел правил. В онлайн-документации API для ParserRuleContext я не нахожу метода/поля, которое может возвращать имя правила, которое представляет объект. Я знаю, что имя правила является частью имени подкласса ParserRuleContext, например. function_definition узел правила относится к классу Function_definitionContext. Но чтобы узнать имя класса, мне нужно использовать отражение Java и вручную разбить строку Context в конце.

Есть ли более простой способ получить имя правила, которое представляет объект ParserRuleContext?

Обычно требуется запросить имя узла родительского правила. Например, при обработке грамматики C++ объявление класса C++ может находиться в глобальной области видимости, определении функции или другом объявлении класса, что означает, что узел правила class_declaration может быть вложен в узел правила global_scope, function_definition или class_declaration. Если я хочу изолировать только те узлы class_declaration под global_scope, мне нужно найти родительские узлы и убедиться, что они не function_definition или class_declaration.


person JavaMan    schedule 27.05.2013    source источник
comment
Вы нашли, как получить родительское правило из данного правила?   -  person MysticForce    schedule 17.06.2016
comment
MysticForce: да, имя правила можно найти методами, описанными в ответе Сэма. Родительский узел находится с помощью RuleContext.getParent().   -  person JavaMan    schedule 18.06.2016


Ответы (1)


Чтобы получить имя правила из ParserRuleContext в виде строки, вы можете сделать это:

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

Вы также можете сравнить индекс правила с сгенерированными константами:

boolean isClassDeclaration =
    parserRuleContext.getRuleIndex() == MyParser.RULE_class_declaration;
person Sam Harwell    schedule 27.05.2013
comment
Теперь, как это сделать в слушателе? - person john ktejik; 02.02.2018