Проверка правила с аргументами

Я пытаюсь проверить некоторые подправила в своем парсере, чтобы проверить варианты. Правило, которое я проверяю, является правилом выражения

expression: expression PLUS expression      # plusExpression
          | expression IS NOT? NULL         # nullExpression
          | columnIdentifier                # columnExpression
          | literal                         # literalExpression
          ;

В сгенерированном синтаксическом анализе сигнатура метода:

public final ExpressionContext expression(int _p) throws RecognitionException {

У меня возникли проблемы с выяснением того, какое значение передать в качестве аргумента _p.

Когда я проверяю вызовы метода выражения в синтаксическом анализаторе, я вижу, что передается 0. Однако, когда я пытаюсь вызвать parser.expression(0) напрямую, я получаю исключение нулевого указателя.

Как рекомендуется вызывать это субправило, чтобы включить модульное тестирование?

В качестве справки, вот код для модульного тестирования, который я пытаюсь написать:

private Expression parseExpression( String expressionString ) {

    DataProcessorLexer lexer = new DataProcessorLexer( new ANTLRInputStream( expressionString ) );
    DataProcessorParser parser = new DataProcessorParser( new CommonTokenStream( lexer ) );

    parser.removeErrorListeners();
    parser.addErrorListener( new DiagnosticErrorListener() );

    // Perform the Parse
    ParseTree tree = parser.expression(0);

    ParseTreeWalker walker = new ParseTreeWalker();
    statementWalker = new StatementWalker();
    walker.walk( statementWalker, tree );

    return statementWalker.getExpressionValue( tree );
}

person DaveDude    schedule 14.02.2013    source источник
comment
Эти метки, #..., AFAIK, предназначены только для использования в классах слушателей дерева. Проверьте свой класс ‹GRAMMAR-NAME›BaseListener, в котором есть методы, соответствующие вашим меткам. Демонстрацию о том, как использовать прослушиватель, см. в статье: stackoverflow .com/questions/14667781/antlr-4-and-ast-visitors   -  person Bart Kiers    schedule 15.02.2013
comment
Я думаю, что рекурсивные правила, такие как expression, должны сначала вызываться из нерекурсивных правил. Существует некоторый контекст, на который должно ссылаться рекурсивное правило, которое, по-видимому, строят только нерекурсивные правила. Достаточно добавить правило типа statement : expression; и вместо этого вызвать statement из тестового кода.   -  person user1201210    schedule 15.02.2013
comment
@tenterhook - этот подход работает. Теперь я могу продолжить тестирование, используя этот подход.   -  person DaveDude    schedule 15.02.2013
comment
github.com/antlr/antlr4/issues/161   -  person Sam Harwell    schedule 19.02.2013