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

时间:2019-06-19 05:41:09

标签: java plsql antlr4

上下文

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

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

我发现了一些元素here,但它可能与之前的帖子已过时

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

使用antlr4 plsql生成的类(Java)

一方面,我使用org.antlr:antlr4-maven-plugin:4.7.2创建了一个maven java项目,它从garmmar文件PlSqlLexer.g4和{{生成了词法分析器,解析器,侦听器和访客类。 3}}是从PlSqlParser.g4

下载的

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

@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 github repository

中的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脚本吗?

1 个答案:

答案 0 :(得分:1)

  

触发上述整个InputStream的适当方法是什么,是否如上面的代码片段所述,调用sql_script()方法?

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

  

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

是的

  

有人建议如何在此antlr4 plsql语法中成功使用grun脚本吗?

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