Получить активное правило Antlr - PullRequest
2 голосов
/ 30 августа 2011

Можно ли получить «активное» правило ANTLR, из которого был вызван метод действия?

Что-то вроде этой лог-функции в Antlr-Pseudo-Code, которая должна показывать начальную и конечную позиции некоторыхправила без передавайте $ start- и $ end-tokens с каждым log () - вызов:

@members{
  private void log() {
    System.out.println("Start: " + $activeRule.start.pos +
                       "End: " + $activeRule.stop.pos);
  }
}

expr: multExpr (('+'|'-') multExpr)* {log(); }
    ;

multExpr
    : atom('*' atom)* {log(); }
    ;

atom: INT
    | ID {log(); }
    | '(' expr ')'
    ;

1 Ответ

0 голосов
/ 30 августа 2011

Нет, нет способа получить имя правила, в котором в данный момент находится синтаксический анализатор. Поймите, что по умолчанию правила синтаксического анализатора - это просто методы 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.

...