gpt4 book ai didi

java - 如何使用antlr4 plsql语法(java和org.antlr.v4.gui.TestRig)

转载 作者:行者123 更新时间:2023-11-30 05:35:44 30 4
gpt4 key购买 nike

上下文

我正在尝试使用从 plsql antlr4 语法文件生成的 Java 类来解析存储在应用程序配置中的一些 SQL。

在这种情况下,我想知道如何正确使用这些类并利用 grun (org.antlr.v4.gui.TestRig) 进行一些测试。

我发现了一些元素here但它可能已经过时了,因为上一篇文章

  • 仅引用一个 .g4 语法文件,而我发现当前存储库中有一个用于 Lexer 的文件和一个用于 Parser 的文件。
  • 我尝试了类似的方法,但 grun 没有成功

使用antlr4 plsql生成的类(Java)

一方面,我使用 org.antlr:antlr4-maven-plugin:4.7.2 创建了一个 Maven Java 项目,它从 Garmmar 文件 PlSqlLexer.g4 生成词法分析器、解析器、监听器和访问者类。和 PlSqlParser.g4antlr4 github repository下载

现在我需要提示如何正确使用生成的类

@Test
public void testPlSqlGrammar() throws IOException {
InputStream is = this.getClass().getClassLoader().getResourceAsStream("testfile.sql");
CharStream s = CharStreams.fromStream(is);
CaseChangingCharStream upper = new CaseChangingCharStream(s, true);
Lexer lexer = new PlSqlLexer(upper);
final CommonTokenStream tokenStream = new CommonTokenStream(lexer);
PlSqlParser parser = new PlSqlParser(tokenStream);

PlSqlParserListener listener = new PlSqlParserListener() {
//here is my listener code
//(...)
}

ParseTreeWalker walker = new ParseTreeWalker();
parser.addParseListener(listener);
parser.sql_script(); // <-- here I called this method which trigger a processing
}

问题1触发整个InputStream处理的正确方法是什么,是按照上面的代码片段调用sql_script()方法吗?

注意 sql_script 是语法的顶级元素

plsql语法和org.antlr.v4.gui.TestRig

另一方面,我想使用 antlr4 getting-started doc 中的 org.antlr.v4.gui.TestRig 工具进行一些测试。

我按照说明在 Windows 上安装了 antlr-4.7.2并从语法生成词法分析器和解析器,如下所示

>antlr4 PlSqlLexer.g4
>java org.antlr.v4.Tool PlSqlLexer.g4
>antlr4 PlSqlParser.g4
>java org.antlr.v4.Tool PlSqlParser.g4

我在文件夹中添加了 PlSqlBaseLexer.java 和 PlSqlBaseParser.java 来编译生成的类

> javac Pl*.java

然后我寻找正确的参数来启动 grun

>grep -i grammar *.g4
PlSqlLexer.g4:lexer grammar PlSqlLexer;
PlSqlParser.g4:parser grammar PlSqlParser;

但是,上述 2 个语法名称(PlSqlLexer、PlSqlParser)不起作用,仅使用“PlSql”通过以下命令触发工具执行

>grun PlSql r -tree
>grun PlSql r -gui

但是他们(都一致)返回了以下错误(以 -gui 风格为例)

>java org.antlr.v4.gui.TestRig PlSql r -gui
SELECT FIELD1 FROM TABLE1;
^Z
No method for rule r or it has arguments

问题2要使用的正确语法名称是什么?是 PlSql 吗?

问题3有什么建议如何成功使用 grun 脚本与此 antlr4 plsql 语法 吗?

最佳答案

What is the proper method to trigger the processing of the whole InputStream, is it as per the above snippet calling sql_script() method ?

是的,要根据 sql_script 规则解析输入,请调用解析器对象上的 sql_script 方法。

What is the correct grammar name to be used ? is it PlSql ?

是的。

Any advise how to use successfully grun script with this antlr4 plsql grammar ?

您需要指定要调用的规则的名称。在您的调用中,您传递了 r 作为规则名称,但语法未定义名为 r 的规则。这就是错误消息试图告诉您的内容。如果您想调用 sql_script 规则,则需要传递该规则而不是 r,因此 grun PlSql sql_script -treegrun PlSql sql_script -gui

关于java - 如何使用antlr4 plsql语法(java和org.antlr.v4.gui.TestRig),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56660700/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com