1/* 2 * The MIT License (MIT) 3 * 4 * Copyright (c) 2020 by Martin Mirchev 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 7 * associated documentation files (the "Software"), to deal in the Software without restriction, 8 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 9 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 10 * furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in all copies or 13 * substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 16 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 * 21 * Project : sqlite-parser; an ANTLR4 grammar for SQLite https://github.com/bkiers/sqlite-parser 22 * Developed by : Bart Kiers, bart@big-o.nl 23 */ 24 25// $antlr-format alignTrailingComments on, columnLimit 150, maxEmptyLinesToKeep 1, reflowComments off, useTab off 26// $antlr-format allowShortRulesOnASingleLine on, alignSemicolons ownLine 27 28lexer grammar SQLiteLexer; 29 30options { 31 caseInsensitive = true; 32} 33 34// TODO: Add JSON operators -> and ->> added in 3.38.0 35SCOL : ';'; 36DOT : '.'; 37OPEN_PAR : '('; 38CLOSE_PAR : ')'; 39COMMA : ','; 40ASSIGN : '='; 41STAR : '*'; 42PLUS : '+'; 43MINUS : '-'; 44TILDE : '~'; 45PIPE2 : '||'; 46DIV : '/'; 47MOD : '%'; 48LT2 : '<<'; 49GT2 : '>>'; 50AMP : '&'; 51PIPE : '|'; 52LT : '<'; 53LT_EQ : '<='; 54GT : '>'; 55GT_EQ : '>='; 56EQ : '=='; 57NOT_EQ1 : '!='; 58NOT_EQ2 : '<>'; 59 60// http://www.sqlite.org/lang_keywords.html 61ABORT_ : 'ABORT'; 62ACTION_ : 'ACTION'; 63ADD_ : 'ADD'; 64AFTER_ : 'AFTER'; 65ALL_ : 'ALL'; 66ALTER_ : 'ALTER'; 67ANALYZE_ : 'ANALYZE'; 68AND_ : 'AND'; 69AS_ : 'AS'; 70ASC_ : 'ASC'; 71ATTACH_ : 'ATTACH'; 72AUTOINCREMENT_ : 'AUTOINCREMENT'; 73BEFORE_ : 'BEFORE'; 74BEGIN_ : 'BEGIN'; 75BETWEEN_ : 'BETWEEN'; 76BY_ : 'BY'; 77CASCADE_ : 'CASCADE'; 78CASE_ : 'CASE'; 79CAST_ : 'CAST'; 80CHECK_ : 'CHECK'; 81COLLATE_ : 'COLLATE'; 82COLUMN_ : 'COLUMN'; 83COMMIT_ : 'COMMIT'; 84CONFLICT_ : 'CONFLICT'; 85CONSTRAINT_ : 'CONSTRAINT'; 86CREATE_ : 'CREATE'; 87CROSS_ : 'CROSS'; 88CURRENT_DATE_ : 'CURRENT_DATE'; 89CURRENT_TIME_ : 'CURRENT_TIME'; 90CURRENT_TIMESTAMP_ : 'CURRENT_TIMESTAMP'; 91DATABASE_ : 'DATABASE'; 92DEFAULT_ : 'DEFAULT'; 93DEFERRABLE_ : 'DEFERRABLE'; 94DEFERRED_ : 'DEFERRED'; 95DELETE_ : 'DELETE'; 96DESC_ : 'DESC'; 97DETACH_ : 'DETACH'; 98DISTINCT_ : 'DISTINCT'; 99DROP_ : 'DROP'; 100EACH_ : 'EACH'; 101ELSE_ : 'ELSE'; 102END_ : 'END'; 103ESCAPE_ : 'ESCAPE'; 104EXCEPT_ : 'EXCEPT'; 105EXCLUSIVE_ : 'EXCLUSIVE'; 106EXISTS_ : 'EXISTS'; 107EXPLAIN_ : 'EXPLAIN'; 108FAIL_ : 'FAIL'; 109FOR_ : 'FOR'; 110FOREIGN_ : 'FOREIGN'; 111FROM_ : 'FROM'; 112FULL_ : 'FULL'; 113GLOB_ : 'GLOB'; 114GROUP_ : 'GROUP'; 115HAVING_ : 'HAVING'; 116IF_ : 'IF'; 117IGNORE_ : 'IGNORE'; 118IMMEDIATE_ : 'IMMEDIATE'; 119IN_ : 'IN'; 120INDEX_ : 'INDEX'; 121INDEXED_ : 'INDEXED'; 122INITIALLY_ : 'INITIALLY'; 123INNER_ : 'INNER'; 124INSERT_ : 'INSERT'; 125INSTEAD_ : 'INSTEAD'; 126INTERSECT_ : 'INTERSECT'; 127INTO_ : 'INTO'; 128IS_ : 'IS'; 129ISNULL_ : 'ISNULL'; 130JOIN_ : 'JOIN'; 131KEY_ : 'KEY'; 132LEFT_ : 'LEFT'; 133LIKE_ : 'LIKE'; 134LIMIT_ : 'LIMIT'; 135MATCH_ : 'MATCH'; 136NATURAL_ : 'NATURAL'; 137NO_ : 'NO'; 138NOT_ : 'NOT'; 139NOTNULL_ : 'NOTNULL'; 140NULL_ : 'NULL'; 141OF_ : 'OF'; 142OFFSET_ : 'OFFSET'; 143ON_ : 'ON'; 144OR_ : 'OR'; 145ORDER_ : 'ORDER'; 146OUTER_ : 'OUTER'; 147PLAN_ : 'PLAN'; 148PRAGMA_ : 'PRAGMA'; 149PRIMARY_ : 'PRIMARY'; 150QUERY_ : 'QUERY'; 151RAISE_ : 'RAISE'; 152RECURSIVE_ : 'RECURSIVE'; 153REFERENCES_ : 'REFERENCES'; 154REGEXP_ : 'REGEXP'; 155REINDEX_ : 'REINDEX'; 156RELEASE_ : 'RELEASE'; 157RENAME_ : 'RENAME'; 158REPLACE_ : 'REPLACE'; 159RESTRICT_ : 'RESTRICT'; 160RETURNING_ : 'RETURNING'; 161RIGHT_ : 'RIGHT'; 162ROLLBACK_ : 'ROLLBACK'; 163ROW_ : 'ROW'; 164ROWS_ : 'ROWS'; 165SAVEPOINT_ : 'SAVEPOINT'; 166SELECT_ : 'SELECT'; 167SET_ : 'SET'; 168TABLE_ : 'TABLE'; 169TEMP_ : 'TEMP'; 170TEMPORARY_ : 'TEMPORARY'; 171THEN_ : 'THEN'; 172TO_ : 'TO'; 173TRANSACTION_ : 'TRANSACTION'; 174TRIGGER_ : 'TRIGGER'; 175UNION_ : 'UNION'; 176UNIQUE_ : 'UNIQUE'; 177UPDATE_ : 'UPDATE'; 178USING_ : 'USING'; 179VACUUM_ : 'VACUUM'; 180VALUES_ : 'VALUES'; 181VIEW_ : 'VIEW'; 182VIRTUAL_ : 'VIRTUAL'; 183WHEN_ : 'WHEN'; 184WHERE_ : 'WHERE'; 185WITH_ : 'WITH'; 186WITHOUT_ : 'WITHOUT'; 187FIRST_VALUE_ : 'FIRST_VALUE'; 188OVER_ : 'OVER'; 189PARTITION_ : 'PARTITION'; 190RANGE_ : 'RANGE'; 191PRECEDING_ : 'PRECEDING'; 192UNBOUNDED_ : 'UNBOUNDED'; 193CURRENT_ : 'CURRENT'; 194FOLLOWING_ : 'FOLLOWING'; 195CUME_DIST_ : 'CUME_DIST'; 196DENSE_RANK_ : 'DENSE_RANK'; 197LAG_ : 'LAG'; 198LAST_VALUE_ : 'LAST_VALUE'; 199LEAD_ : 'LEAD'; 200NTH_VALUE_ : 'NTH_VALUE'; 201NTILE_ : 'NTILE'; 202PERCENT_RANK_ : 'PERCENT_RANK'; 203RANK_ : 'RANK'; 204ROW_NUMBER_ : 'ROW_NUMBER'; 205GENERATED_ : 'GENERATED'; 206ALWAYS_ : 'ALWAYS'; 207STORED_ : 'STORED'; 208TRUE_ : 'TRUE'; 209FALSE_ : 'FALSE'; 210WINDOW_ : 'WINDOW'; 211NULLS_ : 'NULLS'; 212FIRST_ : 'FIRST'; 213LAST_ : 'LAST'; 214FILTER_ : 'FILTER'; 215GROUPS_ : 'GROUPS'; 216EXCLUDE_ : 'EXCLUDE'; 217TIES_ : 'TIES'; 218OTHERS_ : 'OTHERS'; 219DO_ : 'DO'; 220NOTHING_ : 'NOTHING'; 221 222IDENTIFIER: 223 '"' (~'"' | '""')* '"' 224 | '`' (~'`' | '``')* '`' 225 | '[' ~']'* ']' 226 | [A-Z_\u007f-\uffff] [A-Z_0-9\u007f-\uffff]* 227; 228 229NUMERIC_LITERAL: ((DIGIT+ ('.' DIGIT*)?) | ('.' DIGIT+)) ('E' [-+]? DIGIT+)? | '0x' HEX_DIGIT+; 230 231BIND_PARAMETER: '?' DIGIT* | [:@$] IDENTIFIER; 232 233STRING_LITERAL: '\'' ( ~'\'' | '\'\'')* '\''; 234 235BLOB_LITERAL: 'X' STRING_LITERAL; 236 237SINGLE_LINE_COMMENT: '--' ~[\r\n]* (('\r'? '\n') | EOF) -> channel(HIDDEN); 238 239MULTILINE_COMMENT: '/*' .*? '*/' -> channel(HIDDEN); 240 241SPACES: [ \u000B\t\r\n] -> channel(HIDDEN); 242 243UNEXPECTED_CHAR: .; 244 245fragment HEX_DIGIT : [0-9A-F]; 246fragment DIGIT : [0-9];