首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用antlr4 plsql语法(java和org.antlr.v4.gui.TestRig)

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

Stack Overflow用户
提问于 2019-06-19 05:41:09
回答 1查看 1.5K关注 0票数 2

上下文

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

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

我找到了一些元素这里,但它可能已经过时了,因为这篇文章

  • 只引用一个.g4语法文件,而我发现当前存储库中有一个用于Lexer,另一个用于分析器。
  • 我也尝试过类似的方法,但没有成功。

antlr4 plsql生成类的使用(Java)

一方面,我使用org.antlr:antlr4 4- maven -plugin:4.7.2创建了一个maven java项目,它从garmmar文件PlSqlLexer.g4和从antlr4 github存储库下载的PlSqlParser.g4生成lexer、解析器、侦听器和访问者类。

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

代码语言:javascript
复制
@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
}

Question1 --什么是触发整个InputStream处理的适当方法,是否按照上面的代码片段调用sql_script()方法?

注sql_script是语法的顶层元素。

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

另一方面,我想使用来自org.antlr.v4.gui.TestRig的antlr4入门医生工具进行一些测试。

我按照指令在Windows上安装了antlr-4.7.2,并根据语法生成了lexer和解析器,如下所示

代码语言:javascript
复制
>antlr4 PlSqlLexer.g4
>java org.antlr.v4.Tool PlSqlLexer.g4
>antlr4 PlSqlParser.g4
>java org.antlr.v4.Tool PlSqlParser.g4

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

代码语言:javascript
复制
> javac Pl*.java

然后,我寻找合适的参数来启动grun

代码语言:javascript
复制
>grep -i grammar *.g4
PlSqlLexer.g4:lexer grammar PlSqlLexer;
PlSqlParser.g4:parser grammar PlSqlParser;

但是上面的两个语法名称(PlSqlLexer,PlSqlParser)不起作用,只使用"PlSql“通过下面的命令触发工具的执行。

代码语言:javascript
复制
>grun PlSql r -tree
>grun PlSql r -gui

但是它们(都是一致的)返回了以下错误(如-gui风格所示)

代码语言:javascript
复制
>java org.antlr.v4.gui.TestRig PlSql r -gui
SELECT FIELD1 FROM TABLE1;
^Z
No method for rule r or it has arguments

Question2正确的语法名称是什么?是PlSql吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-19 14:31:51

触发整个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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56660700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档