如何在 ANTL4 中执行解析步骤

How to do the parse step in ANTL4

我已经根据 lexer.g4 和 parser.g4 文件生成了相关的 Java 类

我已经写了一个访问者,但是为了使用访问者,我需要一个实际的解析树,我如何从解析器中获取解析树?

在其他在线示例中,提到了 parser.parse() 但在 ANTLR4

下无法编译
class Visitor : PostgreSQLParserBaseVisitor<Unit>() {

    override fun visitSelect_stmt(ctx: PostgreSQLParser.Select_stmtContext?) {
        println(ctx?.text)
        super.visitSelect_stmt(ctx)
    }

}

object Scratch {

    @JvmStatic
    fun main(args: Array<String>) {

        val sql = """
            SELECT * FROM table WHERE column = 1
        """.trimIndent()

        val lexer = PostgreSQLLexer(CharStreams.fromString(sql))
        val parser = PostgreSQLParser(CommonTokenStream(lexer))
        val parseTree: ParseTree = parser.??? <<<

        Visitor().visit(parseTree)

    }

}

parse() 方法对应于名为 parse 的解析器规则。如果 this 是您正在使用的 PostgreSQL 语法,您可能希望使用属于语法入口规则的 root() 方法:

root
    : stmt ((SEMI stmt)+ SEMI)? EOF
    ;