我正在尝试使用从plsql antlr4语法文件生成的Java类解析一些存储在应用程序配置中的SQL。
在这种情况下,我想知道如何正确使用这些类并利用grun(org.antlr.v4.gui.TestRig)进行一些测试。
我发现了一些元素here,但它可能与之前的帖子已过时
一方面,我使用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是语法的顶级元素
另一方面,我想使用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脚本吗?
答案 0 :(得分:1)
触发上述整个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
。