我有一个 Antlr4 问题。鉴于下面的语法摘录。测试访问者中是否存在可选的 actualParameters 子树的正确方法是什么?

我已经尝试了 procedureCallStatement 上下文的 getChildCount 方法。我还在上下文中测试了空的 actualParameters 参数。

如果不存在,我不想访问 actualParameters 子树。这样做会导致异常。

谢谢!

开尔文约翰逊

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

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

actualParameters : expressionStatement (';' expressionStatement)* ;

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

最佳答案

如果解析了,自动生成的上下文方法 ProcedureCallStatementContext.actualParameters() 将返回 ActualParametersContext ,否则将返回 null

您可能会在这样的访问者中使用它:

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

    ...
}

关于ANTLR4 访问者子树检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13850276/

10-10 23:16