Antlr PLSQL,如何获取表达式的位置

Antlr PLSQL, How to get positions of expressions

提问人:Alena 提问时间:7/18/2023 更新时间:7/18/2023 访问量:42

问:

我想使用 antlr PLSQL 解析器来操作来自 Oracle Forms 的 sql 代码。

因此,我创建了所有需要的 Java 类,现在有了这个工作正常的 Main 代码:

CharStream charStream = CharStreams.fromString("CREATE FUNCTION totalCustomers \r\n"
                + "RETURN number IS \r\n"
                + "   total number(2) := 0; \r\n"
                + "BEGIN \r\n"
                + "   SELECT count(*) into total \r\n"
                + "   FROM customers; \r\n"
                + "   RETURN total; \r\n"
                + "END; ");

PlSqlLexer plSqlLexer = new PlSqlLexer(charStream2);
        
CommonTokenStream commonTokenStream = new CommonTokenStream(plSqlLexer);
        
PlSqlParser plSqlParser = new PlSqlParser(commonTokenStream);

PlSqlParser.Create_function_bodyContext sql_scriptContext = plSqlParser.create_function_body();

我可以获取语法错误的数量和解析树的子节点。 但是我想知道如何获得某些表达式的特定位置(字符位置)。

我在互联网上找不到任何关于这方面的信息,但我知道 antlr 能够做到这一点。

有人知道吗?

我查看了 PLSQLParser 提供的所有方法,但似乎没有一个对我有帮助。

java 解析 antlr sql-parser

评论

0赞 kaby76 7/18/2023
您必须四处导航才能收集该信息。在表达式的 ParserRuleContext 中,有 和 。这些是令牌到表达式开始和停止的令牌流 () 中的索引。然后,从表达式的开始标记中获取/列信息。您必须在停止标记之后获取令牌才能获得结束行/列,或者自己进行计算。startstopcommonTokenStream
0赞 Alena 7/20/2023
我不完全确定我是否理解这一点。在我的情况下,ParserRuleContext 是sql_scriptContext。我可以获得开始令牌,但我找不到在开始令牌之后获得下一个令牌的方法。有一个方法:getTokens(int ttype),但我不明白ttype是什么。

答: 暂无答案