如何在ANTL4中执行解析步骤

问题描述

在给定lexer.g4和parser.g4文件的情况下,我已经生成了相关的java类

enter image description here

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

在其他在线示例中,提到了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
    ;