Нет, нет способа получить имя правила, в котором в данный момент находится синтаксический анализатор. Поймите, что по умолчанию правила синтаксического анализатора - это просто методы Java, возвращающие void
.Из метода Java вы не можете узнать его имя во время выполнения, в конце концов (когда внутри этого метода).
Если вы установите output=AST
в options { ... }
вашей грамматики, каждый синтаксический анализаторПравило создает (и возвращает) экземпляр ParserRuleReturnScope
с именем retval
: таким образом, вы могли бы использовать это для своих целей:
// ...
options {
output=AST;
}
// ...
@parser::members{
private void log(ParserRuleReturnScope rule) {
System.out.println("Rule: " + rule.getClass().getName() +
", start: " + rule.start +
", end: " + rule.stop);
}
}
expr: multExpr (('+'|'-') multExpr)* {log(retval);}
;
multExpr
: atom('*' atom)* {log(retval);}
;
atom: INT
| ID {log(retval);}
| '(' expr ')'
;
// ...
Это, однако, не очень надежная вещьсделать: имя переменной вполне может измениться в следующей версии ANTLR.