如何在 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
;
我已经根据 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
;