是否有一个如何使用Antlr 4解析SQL语句的规范示例?



我正在尝试使用Antlr4为SQL语句构建解析器。我真的不关心我使用哪种特定的SQL语法,因为我计划强制只允许ANSI SQL,但在下面的示例中,我碰巧使用了T-SQL语法。下面是我的简单代码:

String sql = "SELECT ROW_NUMBER() OVER (ORDER BY id) FROM some_table";
TSqlLexer tSqlLexer = new TSqlLexer(CharStreams.fromString(sql));
CommonTokenStream stream = new CommonTokenStream(tSqlLexer);
TSqlParser parser = new TSqlParser(stream);
ParseTree tree = parser.tsql_file();  // errors happen here
ParseTreeWalker walker = new ParseTreeWalker();
// I built a custom listener, so far not much in it
AnalyticFunctionBaseListener listener = new AnalyticFunctionBaseListener();
walker.walk(listener, tree);

在生成以下错误/警告之前,代码只执行到对tsql_file()的调用:

line 1:35 token recognition error at: 'i'
line 1:36 token recognition error at: 'd'
line 1:44 token recognition error at: 's'
line 1:45 token recognition error at: 'o'
line 1:46 token recognition error at: 'm'
line 1:47 token recognition error at: 'e'
line 1:49 token recognition error at: 't'
line 1:50 token recognition error at: 'a'
line 1:51 token recognition error at: 'b'
line 1:52 token recognition error at: 'l'
line 1:53 token recognition error at: 'e'
line 1:37 no viable alternative at input 'SELECTROW_NUMBER()OVER(ORDERBY)'

显然我在这里遗漏了一些重要的东西,但我不知道那是什么。我使用在ANTLR GitHub网站上发布的TSQL语法进行构建。

任何Antlr大师可以修改上面的代码片段使其工作吗?我希望有人能给出一个如何使用Antlr解析基本SQL语句的典型例子。

请注意README中的以下注释:

用法,重要说明

由于SQL语法通常不区分大小写,但这个语法实现是,您必须使用自定义字符流将所有字符转换为大写,然后将它们发送给词法分析器。

您可以在这里找到更多关于各种目标语言实现的信息。

简而言之,修改你的代码:

String sql = "SELECT ROW_NUMBER() OVER (ORDER BY id) FROM some_table";
TSqlLexer tSqlLexer = new TSqlLexer(CharStreams.fromString(sql));

:

String sql = "SELECT ROW_NUMBER() OVER (ORDER BY id) FROM some_table";
CharStream s = CharStreams.fromString(sql);
TSqlLexer tSqlLexer = new TSqlLexer(new CaseChangingCharStream(s, true));

在这里找到CaseChangingCharStream的来源:https://github.com/antlr/antlr4/blob/master/doc/resources/CaseChangingCharStream.java

编辑

在评论中,Mike建议:

或者你可以使用MySQL语法,它支持不区分大小写的关键字,而不需要额外的流

可能是一个更好的选择。我并不是说T-SQL语法不好或不准确,但是Mike建议的语法来自官方MySQL仓库(Mike也参与了其中)这一事实会让我对它的质量有信心。

最新更新