微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ANTLR4 PLSQL语法问题-将连字符与SQL * Plus命令一起使用

如何解决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 举报,一经查实,本站将立刻删除。