【问题标题】:How to use antlr4 plsql grammar (java and org.antlr.v4.gui.TestRig)如何使用antlr4 plsql语法(java和org.antlr.v4.gui.TestRig)
【发布时间】:2019-06-19 22:31:51
【问题描述】:

上下文

我正在尝试使用从 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.g4PlSqlParser.g4 生成词法分析器、解析器、侦听器和访问者类来自antlr4 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处理的正确方法是什么,是按照上面的sn-p调用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 任何建议如何使用这个 antlr4 plsql 语法成功地使用 grun 脚本

【问题讨论】:

    标签: java plsql antlr4


    【解决方案1】:

    触发整个InputStream处理的正确方法是什么,是按照上面的sn-p调用sql_script()方法吗?

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

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

    是的。

    任何建议如何使用这个 antlr4 plsql 语法成功地使用 grun 脚本?

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

    【讨论】:

    • +1 谢谢。我确认命令 grun PlSql sql_script -treegrun PlSql sql_script -gui 工作正常。
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多