Я пытаюсь проверить некоторые подправила в своем парсере, чтобы проверить варианты. Правило, которое я проверяю, является правилом выражения
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 );
}
#...
, AFAIK, предназначены только для использования в классах слушателей дерева. Проверьте свой класс ‹GRAMMAR-NAME›BaseListener, в котором есть методы, соответствующие вашим меткам. Демонстрацию о том, как использовать прослушиватель, см. в статье: stackoverflow .com/questions/14667781/antlr-4-and-ast-visitors - person Bart Kiers   schedule 15.02.2013expression
, должны сначала вызываться из нерекурсивных правил. Существует некоторый контекст, на который должно ссылаться рекурсивное правило, которое, по-видимому, строят только нерекурсивные правила. Достаточно добавить правило типаstatement : expression;
и вместо этого вызватьstatement
из тестового кода. - person user1201210   schedule 15.02.2013