【发布时间】: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.g4 和 PlSqlParser.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 脚本?
【问题讨论】: