Search code examples
antlrvisitor-patternantlr4

ANTLR4 Visitor subtree check


I have an Antlr4 question. Given the grammar excerpt below. What is the correct approach to testing for the existence of the optional actualParameters subtree within a visitor?

I have tried the getChildCount method of the procedureCallStatement context. I've also tested for a null actualParameters parameter on the context.

I do not want to visit the actualParameters subtree if it does not exist. Doing so causes an exception.

Thank you!

Kelvin Johnson

program : statement (';' statement)* ';'?;

statement : CALLPREFIX('(' actualParameters? ')')?  #procedureCallStatement;

actualParameters : expressionStatement (';' expressionStatement)* ;

expressionStatement : '(' expressionStatement ')'  #parensExpression
| IDENT'[' expressionStatement ']' #subscript
...

Solution

  • The automatically-generated context method ProcedureCallStatementContext.actualParameters() will return the ActualParametersContext if one was parsed, otherwise it will return null.

    You might make use of it in a visitor like this:

    public T VisitProcedureCallStatement(ProcedureCallStatementContext ctx) {
        if (ctx.actualParameters() != null) {
            // do something here
        }
    
        ...
    }