上下文
我试图使用从plsql antlr4语法文件生成的Java类来解析存储在应用程序配置中的一些SQL。
在这种情况下,我想知道如何正确地使用这些类并利用grun (org.antlr.v4.gui.TestRig)进行一些测试。
我找到了一些元素这里,但它可能已经过时了,因为这篇文章
antlr4 plsql生成类的使用(Java)
一方面,我使用org.antlr:antlr4 4- maven -plugin:4.7.2创建了一个maven java项目,它从garmmar文件PlSqlLexer.g4和从antlr4 github存储库下载的PlSqlParser.g4生成lexer、解析器、侦听器和访问者类。
现在我需要一个提示,如何正确地使用生成的类
@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和解析器,如下所示
>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;但是上面的两个语法名称(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 argumentsQuestion2正确的语法名称是什么?是PlSql吗?
Question3,建议如何成功地使用grun脚本和这个antlr4 plsql语法?
发布于 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 -tree或grun PlSql sql_script -gui。
https://stackoverflow.com/questions/56660700
复制相似问题