我正在尝试为Antlr4中动态确定的批处理分隔符创建词法分析器规则 . 这支持两个用例:
不同的数据库系统定义了自己的批处理分隔符(例如'go',';''/')
我还想允许用户定义的批处理分隔符,最长可达2个字符,并且可能是任何东西,但是对于这个示例,我们假设它们是ascii字符 .
因此,出于本示例的目的,批处理分隔符是单独在其自身行上的任何字符串,并与当前已知的批处理分隔符匹配 . 还有几个更复杂的选择,但我想保持这个简单,因为问题是关于词法分析器中的动作和语义谓词,而不是批处理分隔符 .
因此,假设我已经定义了一个名为ALPHA的词法规则,它匹配任何大写或小写字母 . 另外,假设我只是尝试匹配 '\r'?'\n''\r'?'\n' ,即它自己的行上的批处理分隔符,而没有其他空格来对抗
我定义了以下词法规则:
BATCH_SEPARATOR:
NEWLINE ALPHA (ALPHA)? NEWLINE
;
NEWLINE: '\r'?'\n';
此规则适用于大多数情况,但不考虑将输入批处理分隔符候选项与批处理分隔符的有效值动态匹配 . 因此,虽然它会成功地lex 'go',';'等,当它们作为 SELECT 或 CREATE FUNCTION 语句的一部分出现在它们自己的行上时,它将错误地将'IN','AS'等作为批处理分隔符 .
所以现在我采取下一步检查实际的字