如何解决ANTLR4 PLSQL语法问题-将连字符与SQL * Plus命令一起使用
我是ANTLR的新手,正在使用ANTLR4(4.7.2 Jar文件)。我目前正在研究Oracle Parser。我的连字符('-')用法语法有问题。
我正在处理一个处理脚本的项目(包括PLsql命令以及sql * Plus命令)。因此,我的语法需要处理两种情况并正确解析。我确实找到了约53条命令(12.2 Oracle版本)。
对于sql Plus命令,它指出“您可以通过在行尾键入连字符并按Return键来继续执行长的sql Plus命令。 在语法中执行此操作的一种方法是,将连字符和Line一起发送给连字符,如下所示。
WS : [ \u000B\t] -> channel(HIDDEN);
sqlPLUS_END_WITH_HYPEN : ('-' WS* NEWLINE) -> skip;
但是这破坏了我的sql语法,因为连字符后接行是可以接受的。 例如以下内容应该可以正常工作。
Select 1 -
2 from dual;
我该如何解决?
解决方法
文档状态(强调我的意思):
您可以通过在行末键入连字符并按[Return]来继续执行长SQL * Plus命令。如果需要,可以在键入连字符之前键入一个空格。 SQL * Plus在每行之后都显示一个直角括号(>)作为提示。
-https://docs.oracle.com/cd/B10501_01/server.920/a90842/ch13.htm
还有这个(重点是我的):
SQL * Plus是一个交互式的批处理查询工具,随每个Oracle Database安装一起安装。 [...]
-https://docs.oracle.com/cd/B19306_01/server.102/b14357/qstart.htm#i1056581
换句话说:连字符行继续无效是Oracle SQL。交互式SQL * Plus工具仅在解释/评估SQL之前处理此问题。我不明白您为什么要在语法上处理这个问题。
因此,如果您确实想在语法中考虑此类情况,那么除了 not 跳过以下几行续行之外,我别无选择:
SQLPLUS_END_WITH_HYPHEN : ('-' NEWLINE);
(请注意,在规范中,-
后应直接跟一个换行符/换行符)
然后将此SQLPLUS_END_WITH_HYPHEN
添加到所有可能发生解析器的规则中(是的,这会很多)。减号可以这样处理:
expr
: ...
| minus expr
| expr ( minus | PLUS ) expr
| ...
;
minus : MINUS | SQLPLUS_END_WITH_HYPHEN;
SQLPLUS_END_WITH_HYPHEN : ('-' NEWLINE);
MINUS : '-';
PLUS : '+';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。