app/aws-lsp-antlr4-runtimes/PostgreSQLLexer.g4 (838 lines of code) (raw):

/* based on https://github.com/tunnelvisionlabs/antlr4-grammar-postgresql/blob/master/src/com/tunnelvisionlabs/postgresql/PostgreSqlLexer.g4 */ /* * [The "MIT license"] * Copyright (C) 2014 Sam Harwell, Tunnel Vision Laboratories, LLC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * 1. The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * 2. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * 3. Except as contained in this notice, the name of Tunnel Vision * Laboratories, LLC. shall not be used in advertising or otherwise to * promote the sale, use or other dealings in this Software without prior * written authorization from Tunnel Vision Laboratories, LLC. */ // $antlr-format alignTrailingComments true, columnLimit 150, maxEmptyLinesToKeep 1, reflowComments false, useTab false // $antlr-format allowShortRulesOnASingleLine true, allowShortBlocksOnASingleLine true, minEmptyLines 0, alignSemicolons ownLine // $antlr-format alignColons trailing, singleLineOverrulesHangingColon true, alignLexerCommands true, alignLabels true, alignTrailers true lexer grammar PostgreSQLLexer; /* Reference: * http://www.postgresql.org/docs/9.3/static/sql-syntax-lexical.html */ options { superClass = PostgreSQLLexerBase; caseInsensitive = true; } // Insert here @header for C++ lexer. Dollar: '$'; OPEN_PAREN: '('; CLOSE_PAREN: ')'; OPEN_BRACKET: '['; CLOSE_BRACKET: ']'; COMMA: ','; SEMI: ';'; COLON: ':'; STAR: '*'; EQUAL: '='; DOT: '.'; //NamedArgument : ':='; PLUS: '+'; MINUS: '-'; SLASH: '/'; CARET: '^'; LT: '<'; GT: '>'; LESS_LESS: '<<'; GREATER_GREATER: '>>'; COLON_EQUALS: ':='; LESS_EQUALS: '<='; EQUALS_GREATER: '=>'; GREATER_EQUALS: '>='; DOT_DOT: '..'; NOT_EQUALS: '<>'; TYPECAST: '::'; PERCENT: '%'; PARAM: '$' ([0-9])+; // // OPERATORS (4.1.3) // // this rule does not allow + or - at the end of a multi-character operator Operator: ( ( OperatorCharacter | ('+' | '-' {this.CheckLaMinus()}? )+ (OperatorCharacter | '/' {this.CheckLaStar()}? ) | '/' {this.CheckLaStar()}? )+ | // special handling for the single-character operators + and - [+-] ) //TODO somehow rewrite this part without using Actions {this.HandleLessLessGreaterGreater();} ; /* This rule handles operators which end with + or -, and sets the token type to Operator. It is comprised of four * parts, in order: * * 1. A prefix, which does not contain a character from the required set which allows + or - to appear at the end of * the operator. * 2. A character from the required set which allows + or - to appear at the end of the operator. * 3. An optional sub-token which takes the form of an operator which does not include a + or - at the end of the * sub-token. * 4. A suffix sequence of + and - characters. */ OperatorEndingWithPlusMinus: (OperatorCharacterNotAllowPlusMinusAtEnd | '-' {this.CheckLaMinus()}? | '/' {this.CheckLaStar()}? )* OperatorCharacterAllowPlusMinusAtEnd Operator? ( '+' | '-' {this.CheckLaMinus()}? )+ -> type (Operator) ; // Each of the following fragment rules omits the +, -, and / characters, which must always be handled in a special way // by the operator rules above. fragment OperatorCharacter: [*<>=~!@%^&|`?#]; // these are the operator characters that don't count towards one ending with + or - fragment OperatorCharacterNotAllowPlusMinusAtEnd: [*<>=+]; // an operator may end with + or - if it contains one of these characters fragment OperatorCharacterAllowPlusMinusAtEnd: [~!@%^&|`?#]; // // KEYWORDS (Appendix C) JSON: 'JSON'; JSON_ARRAY: 'JSON_ARRAY'; JSON_ARRAYAGG: 'JSON_ARRAYAGG'; JSON_EXISTS: 'JSON_EXISTS'; JSON_OBJECT: 'JSON_OBJECT'; JSON_OBJECTAGG: 'JSON_OBJECTAGG'; JSON_QUERY: 'JSON_QUERY'; JSON_SCALAR: 'JSON_SCALAR'; JSON_SERIALIZE: 'JSON_SERIALIZE'; JSON_TABLE: 'JSON_TABLE'; JSON_VALUE: 'JSON_VALUE'; MERGE_ACTION: 'MERGE_ACTION'; SYSTEM_USER: 'SYSTEM_USER'; ABSENT: 'ABSENT'; ASENSITIVE: 'ASENSITIVE'; ATOMIC: 'ATOMIC'; BREADTH: 'BREATH'; COMPRESSION: 'COMPRESSION'; CONDITIONAL: 'CONDITIONAL'; DEPTH: 'DEPTH'; EMPTY_P: 'EMPTY'; FINALIZE: 'FINALIZE'; INDENT: 'INDENT'; KEEP: 'KEEP'; KEYS: 'KEYS'; NESTED: 'NESTED'; OMIT: 'OMIT'; PARAMETER: 'PARAMETER'; PATH: 'PATH'; PLAN: 'PLAN'; QUOTES: 'QUOTES'; SCALAR: 'SCALAR'; SOURCE: 'SOURCE'; STRING_P: 'STRING'; TARGET: 'TARGET'; UNCONDITIONAL: 'UNCONDITIONAL'; PERIOD: 'PERIOD'; FORMAT_LA: 'FORMAT_LA'; // // // reserved keywords // ALL: 'ALL'; ANALYSE: 'ANALYSE'; ANALYZE: 'ANALYZE'; AND: 'AND'; ANY: 'ANY'; ARRAY: 'ARRAY'; AS: 'AS'; ASC: 'ASC'; ASYMMETRIC: 'ASYMMETRIC'; BOTH: 'BOTH'; CASE: 'CASE'; CAST: 'CAST'; CHECK: 'CHECK'; COLLATE: 'COLLATE'; COLUMN: 'COLUMN'; CONSTRAINT: 'CONSTRAINT'; CREATE: 'CREATE'; CURRENT_CATALOG: 'CURRENT_CATALOG'; CURRENT_DATE: 'CURRENT_DATE'; CURRENT_ROLE: 'CURRENT_ROLE'; CURRENT_TIME: 'CURRENT_TIME'; CURRENT_TIMESTAMP: 'CURRENT_TIMESTAMP'; CURRENT_USER: 'CURRENT_USER'; DEFAULT: 'DEFAULT'; DEFERRABLE: 'DEFERRABLE'; DESC: 'DESC'; DISTINCT: 'DISTINCT'; DO: 'DO'; ELSE: 'ELSE'; EXCEPT: 'EXCEPT'; FALSE_P: 'FALSE'; FETCH: 'FETCH'; FOR: 'FOR'; FOREIGN: 'FOREIGN'; FROM: 'FROM'; GRANT: 'GRANT'; GROUP_P: 'GROUP'; HAVING: 'HAVING'; IN_P: 'IN'; INITIALLY: 'INITIALLY'; INTERSECT: 'INTERSECT'; INTO: 'INTO'; LATERAL_P: 'LATERAL'; LEADING: 'LEADING'; LIMIT: 'LIMIT'; LOCALTIME: 'LOCALTIME'; LOCALTIMESTAMP: 'LOCALTIMESTAMP'; NOT: 'NOT'; NULL_P: 'NULL'; OFFSET: 'OFFSET'; ON: 'ON'; ONLY: 'ONLY'; OR: 'OR'; ORDER: 'ORDER'; PLACING: 'PLACING'; PRIMARY: 'PRIMARY'; REFERENCES: 'REFERENCES'; RETURNING: 'RETURNING'; SELECT: 'SELECT'; SESSION_USER: 'SESSION_USER'; SOME: 'SOME'; SYMMETRIC: 'SYMMETRIC'; TABLE: 'TABLE'; THEN: 'THEN'; TO: 'TO'; TRAILING: 'TRAILING'; TRUE_P: 'TRUE'; UNION: 'UNION'; UNIQUE: 'UNIQUE'; USER: 'USER'; USING: 'USING'; VARIADIC: 'VARIADIC'; WHEN: 'WHEN'; WHERE: 'WHERE'; WINDOW: 'WINDOW'; WITH: 'WITH'; // // reserved keywords (can be function or type) // AUTHORIZATION: 'AUTHORIZATION'; BINARY: 'BINARY'; COLLATION: 'COLLATION'; CONCURRENTLY: 'CONCURRENTLY'; CROSS: 'CROSS'; CURRENT_SCHEMA: 'CURRENT_SCHEMA'; FREEZE: 'FREEZE'; FULL: 'FULL'; ILIKE: 'ILIKE'; INNER_P: 'INNER'; IS: 'IS'; ISNULL: 'ISNULL'; JOIN: 'JOIN'; LEFT: 'LEFT'; LIKE: 'LIKE'; NATURAL: 'NATURAL'; NOTNULL: 'NOTNULL'; OUTER_P: 'OUTER'; OVER: 'OVER'; OVERLAPS: 'OVERLAPS'; RIGHT: 'RIGHT'; SIMILAR: 'SIMILAR'; VERBOSE: 'VERBOSE'; // // non-reserved keywords // ABORT_P: 'ABORT'; ABSOLUTE_P: 'ABSOLUTE'; ACCESS: 'ACCESS'; ACTION: 'ACTION'; ADD_P: 'ADD'; ADMIN: 'ADMIN'; AFTER: 'AFTER'; AGGREGATE: 'AGGREGATE'; ALSO: 'ALSO'; ALTER: 'ALTER'; ALWAYS: 'ALWAYS'; ASSERTION: 'ASSERTION'; ASSIGNMENT: 'ASSIGNMENT'; AT: 'AT'; ATTRIBUTE: 'ATTRIBUTE'; BACKWARD: 'BACKWARD'; BEFORE: 'BEFORE'; BEGIN_P: 'BEGIN'; BY: 'BY'; CACHE: 'CACHE'; CALLED: 'CALLED'; CASCADE: 'CASCADE'; CASCADED: 'CASCADED'; CATALOG: 'CATALOG'; CHAIN: 'CHAIN'; CHARACTERISTICS: 'CHARACTERISTICS'; CHECKPOINT: 'CHECKPOINT'; CLASS: 'CLASS'; CLOSE: 'CLOSE'; CLUSTER: 'CLUSTER'; COMMENT: 'COMMENT'; COMMENTS: 'COMMENTS'; COMMIT: 'COMMIT'; COMMITTED: 'COMMITTED'; CONFIGURATION: 'CONFIGURATION'; CONNECTION: 'CONNECTION'; CONSTRAINTS: 'CONSTRAINTS'; CONTENT_P: 'CONTENT'; CONTINUE_P: 'CONTINUE'; CONVERSION_P: 'CONVERSION'; COPY: 'COPY'; COST: 'COST'; CSV: 'CSV'; CURSOR: 'CURSOR'; CYCLE: 'CYCLE'; DATA_P: 'DATA'; DATABASE: 'DATABASE'; DAY_P: 'DAY'; DEALLOCATE: 'DEALLOCATE'; DECLARE: 'DECLARE'; DEFAULTS: 'DEFAULTS'; DEFERRED: 'DEFERRED'; DEFINER: 'DEFINER'; DELETE_P: 'DELETE'; DELIMITER: 'DELIMITER'; DELIMITERS: 'DELIMITERS'; DICTIONARY: 'DICTIONARY'; DISABLE_P: 'DISABLE'; DISCARD: 'DISCARD'; DOCUMENT_P: 'DOCUMENT'; DOMAIN_P: 'DOMAIN'; DOUBLE_P: 'DOUBLE'; DROP: 'DROP'; EACH: 'EACH'; ENABLE_P: 'ENABLE'; ENCODING: 'ENCODING'; ENCRYPTED: 'ENCRYPTED'; ENUM_P: 'ENUM'; ESCAPE: 'ESCAPE'; EVENT: 'EVENT'; EXCLUDE: 'EXCLUDE'; EXCLUDING: 'EXCLUDING'; EXCLUSIVE: 'EXCLUSIVE'; EXECUTE: 'EXECUTE'; EXPLAIN: 'EXPLAIN'; EXTENSION: 'EXTENSION'; EXTERNAL: 'EXTERNAL'; FAMILY: 'FAMILY'; FIRST_P: 'FIRST'; FOLLOWING: 'FOLLOWING'; FORCE: 'FORCE'; FORWARD: 'FORWARD'; FUNCTION: 'FUNCTION'; FUNCTIONS: 'FUNCTIONS'; GLOBAL: 'GLOBAL'; GRANTED: 'GRANTED'; HANDLER: 'HANDLER'; HEADER_P: 'HEADER'; HOLD: 'HOLD'; HOUR_P: 'HOUR'; IDENTITY_P: 'IDENTITY'; IF_P: 'IF'; IMMEDIATE: 'IMMEDIATE'; IMMUTABLE: 'IMMUTABLE'; IMPLICIT_P: 'IMPLICIT'; INCLUDING: 'INCLUDING'; INCREMENT: 'INCREMENT'; INDEX: 'INDEX'; INDEXES: 'INDEXES'; INHERIT: 'INHERIT'; INHERITS: 'INHERITS'; INLINE_P: 'INLINE'; INSENSITIVE: 'INSENSITIVE'; INSERT: 'INSERT'; INSTEAD: 'INSTEAD'; INVOKER: 'INVOKER'; ISOLATION: 'ISOLATION'; KEY: 'KEY'; LABEL: 'LABEL'; LANGUAGE: 'LANGUAGE'; LARGE_P: 'LARGE'; LAST_P: 'LAST'; //LC_COLLATE : 'LC'_'COLLATE; //LC_CTYPE : 'LC'_'CTYPE; LEAKPROOF: 'LEAKPROOF'; LEVEL: 'LEVEL'; LISTEN: 'LISTEN'; LOAD: 'LOAD'; LOCAL: 'LOCAL'; LOCATION: 'LOCATION'; LOCK_P: 'LOCK'; MAPPING: 'MAPPING'; MATCH: 'MATCH'; MATCHED: 'MATCHED'; MATERIALIZED: 'MATERIALIZED'; MAXVALUE: 'MAXVALUE'; MERGE: 'MERGE'; MINUTE_P: 'MINUTE'; MINVALUE: 'MINVALUE'; MODE: 'MODE'; MONTH_P: 'MONTH'; MOVE: 'MOVE'; NAME_P: 'NAME'; NAMES: 'NAMES'; NEXT: 'NEXT'; NO: 'NO'; NOTHING: 'NOTHING'; NOTIFY: 'NOTIFY'; NOWAIT: 'NOWAIT'; NULLS_P: 'NULLS'; OBJECT_P: 'OBJECT'; OF: 'OF'; OFF: 'OFF'; OIDS: 'OIDS'; OPERATOR: 'OPERATOR'; OPTION: 'OPTION'; OPTIONS: 'OPTIONS'; OWNED: 'OWNED'; OWNER: 'OWNER'; PARSER: 'PARSER'; PARTIAL: 'PARTIAL'; PARTITION: 'PARTITION'; PASSING: 'PASSING'; PASSWORD: 'PASSWORD'; PLANS: 'PLANS'; PRECEDING: 'PRECEDING'; PREPARE: 'PREPARE'; PREPARED: 'PREPARED'; PRESERVE: 'PRESERVE'; PRIOR: 'PRIOR'; PRIVILEGES: 'PRIVILEGES'; PROCEDURAL: 'PROCEDURAL'; PROCEDURE: 'PROCEDURE'; PROGRAM: 'PROGRAM'; QUOTE: 'QUOTE'; RANGE: 'RANGE'; READ: 'READ'; REASSIGN: 'REASSIGN'; RECHECK: 'RECHECK'; RECURSIVE: 'RECURSIVE'; REF: 'REF'; REFRESH: 'REFRESH'; REINDEX: 'REINDEX'; RELATIVE_P: 'RELATIVE'; RELEASE: 'RELEASE'; RENAME: 'RENAME'; REPEATABLE: 'REPEATABLE'; REPLACE: 'REPLACE'; REPLICA: 'REPLICA'; RESET: 'RESET'; RESTART: 'RESTART'; RESTRICT: 'RESTRICT'; RETURNS: 'RETURNS'; REVOKE: 'REVOKE'; ROLE: 'ROLE'; ROLLBACK: 'ROLLBACK'; ROWS: 'ROWS'; RULE: 'RULE'; SAVEPOINT: 'SAVEPOINT'; SCHEMA: 'SCHEMA'; SCROLL: 'SCROLL'; SEARCH: 'SEARCH'; SECOND_P: 'SECOND'; SECURITY: 'SECURITY'; SEQUENCE: 'SEQUENCE'; SEQUENCES: 'SEQUENCES'; SERIALIZABLE: 'SERIALIZABLE'; SERVER: 'SERVER'; SESSION: 'SESSION'; SET: 'SET'; SHARE: 'SHARE'; SHOW: 'SHOW'; SIMPLE: 'SIMPLE'; SNAPSHOT: 'SNAPSHOT'; STABLE: 'STABLE'; STANDALONE_P: 'STANDALONE'; START: 'START'; STATEMENT: 'STATEMENT'; STATISTICS: 'STATISTICS'; STDIN: 'STDIN'; STDOUT: 'STDOUT'; STORAGE: 'STORAGE'; STRICT_P: 'STRICT'; STRIP_P: 'STRIP'; SYSID: 'SYSID'; SYSTEM_P: 'SYSTEM'; TABLES: 'TABLES'; TABLESPACE: 'TABLESPACE'; TEMP: 'TEMP'; TEMPLATE: 'TEMPLATE'; TEMPORARY: 'TEMPORARY'; TEXT_P: 'TEXT'; TRANSACTION: 'TRANSACTION'; TRIGGER: 'TRIGGER'; TRUNCATE: 'TRUNCATE'; TRUSTED: 'TRUSTED'; TYPE_P: 'TYPE'; TYPES_P: 'TYPES'; UNBOUNDED: 'UNBOUNDED'; UNCOMMITTED: 'UNCOMMITTED'; UNENCRYPTED: 'UNENCRYPTED'; UNKNOWN: 'UNKNOWN'; UNLISTEN: 'UNLISTEN'; UNLOGGED: 'UNLOGGED'; UNTIL: 'UNTIL'; UPDATE: 'UPDATE'; VACUUM: 'VACUUM'; VALID: 'VALID'; VALIDATE: 'VALIDATE'; VALIDATOR: 'VALIDATOR'; //VALUE : 'VALUE; VARYING: 'VARYING'; VERSION_P: 'VERSION'; VIEW: 'VIEW'; VOLATILE: 'VOLATILE'; WHITESPACE_P: 'WHITESPACE'; WITHOUT: 'WITHOUT'; WORK: 'WORK'; WRAPPER: 'WRAPPER'; WRITE: 'WRITE'; XML_P: 'XML'; YEAR_P: 'YEAR'; YES_P: 'YES'; ZONE: 'ZONE'; // // non-reserved keywords (can not be function or type) // BETWEEN: 'BETWEEN'; BIGINT: 'BIGINT'; BIT: 'BIT'; BOOLEAN_P: 'BOOLEAN'; CHAR_P: 'CHAR'; CHARACTER: 'CHARACTER'; COALESCE: 'COALESCE'; DEC: 'DEC'; DECIMAL_P: 'DECIMAL'; EXISTS: 'EXISTS'; EXTRACT: 'EXTRACT'; FLOAT_P: 'FLOAT'; GREATEST: 'GREATEST'; INOUT: 'INOUT'; INT_P: 'INT'; INTEGER: 'INTEGER'; INTERVAL: 'INTERVAL'; LEAST: 'LEAST'; NATIONAL: 'NATIONAL'; NCHAR: 'NCHAR'; NONE: 'NONE'; NULLIF: 'NULLIF'; NUMERIC: 'NUMERIC'; OVERLAY: 'OVERLAY'; POSITION: 'POSITION'; PRECISION: 'PRECISION'; REAL: 'REAL'; ROW: 'ROW'; SETOF: 'SETOF'; SMALLINT: 'SMALLINT'; SUBSTRING: 'SUBSTRING'; TIME: 'TIME'; TIMESTAMP: 'TIMESTAMP'; TREAT: 'TREAT'; TRIM: 'TRIM'; VALUES: 'VALUES'; VARCHAR: 'VARCHAR'; XMLATTRIBUTES: 'XMLATTRIBUTES'; XMLCOMMENT: 'XMLCOMMENT'; XMLAGG: 'XMLAGG'; XML_IS_WELL_FORMED: 'XML_IS_WELL_FORMED'; XML_IS_WELL_FORMED_DOCUMENT: 'XML_IS_WELL_FORMED_DOCUMENT'; XML_IS_WELL_FORMED_CONTENT: 'XML_IS_WELL_FORMED_CONTENT'; XPATH: 'XPATH'; XPATH_EXISTS: 'XPATH_EXISTS'; XMLCONCAT: 'XMLCONCAT'; XMLELEMENT: 'XMLELEMENT'; XMLEXISTS: 'XMLEXISTS'; XMLFOREST: 'XMLFOREST'; XMLPARSE: 'XMLPARSE'; XMLPI: 'XMLPI'; XMLROOT: 'XMLROOT'; XMLSERIALIZE: 'XMLSERIALIZE'; //MISSED CALL: 'CALL'; CURRENT_P: 'CURRENT'; ATTACH: 'ATTACH'; DETACH: 'DETACH'; EXPRESSION: 'EXPRESSION'; GENERATED: 'GENERATED'; LOGGED: 'LOGGED'; STORED: 'STORED'; INCLUDE: 'INCLUDE'; ROUTINE: 'ROUTINE'; TRANSFORM: 'TRANSFORM'; IMPORT_P: 'IMPORT'; POLICY: 'POLICY'; METHOD: 'METHOD'; REFERENCING: 'REFERENCING'; NEW: 'NEW'; OLD: 'OLD'; VALUE_P: 'VALUE'; SUBSCRIPTION: 'SUBSCRIPTION'; PUBLICATION: 'PUBLICATION'; OUT_P: 'OUT'; END_P: 'END'; ROUTINES: 'ROUTINES'; SCHEMAS: 'SCHEMAS'; PROCEDURES: 'PROCEDURES'; INPUT_P: 'INPUT'; SUPPORT: 'SUPPORT'; PARALLEL: 'PARALLEL'; SQL_P: 'SQL'; DEPENDS: 'DEPENDS'; OVERRIDING: 'OVERRIDING'; CONFLICT: 'CONFLICT'; SKIP_P: 'SKIP'; LOCKED: 'LOCKED'; TIES: 'TIES'; ROLLUP: 'ROLLUP'; CUBE: 'CUBE'; GROUPING: 'GROUPING'; SETS: 'SETS'; TABLESAMPLE: 'TABLESAMPLE'; ORDINALITY: 'ORDINALITY'; XMLTABLE: 'XMLTABLE'; COLUMNS: 'COLUMNS'; XMLNAMESPACES: 'XMLNAMESPACES'; ROWTYPE: 'ROWTYPE'; NORMALIZED: 'NORMALIZED'; WITHIN: 'WITHIN'; FILTER: 'FILTER'; GROUPS: 'GROUPS'; OTHERS: 'OTHERS'; NFC: 'NFC'; NFD: 'NFD'; NFKC: 'NFKC'; NFKD: 'NFKD'; UESCAPE: 'UESCAPE'; VIEWS: 'VIEWS'; NORMALIZE: 'NORMALIZE'; DUMP: 'DUMP'; ERROR: 'ERROR'; USE_VARIABLE: 'USE_VARIABLE'; USE_COLUMN: 'USE_COLUMN'; CONSTANT: 'CONSTANT'; PERFORM: 'PERFORM'; GET: 'GET'; DIAGNOSTICS: 'DIAGNOSTICS'; STACKED: 'STACKED'; ELSIF: 'ELSIF'; WHILE: 'WHILE'; FOREACH: 'FOREACH'; SLICE: 'SLICE'; EXIT: 'EXIT'; RETURN: 'RETURN'; RAISE: 'RAISE'; SQLSTATE: 'SQLSTATE'; DEBUG: 'DEBUG'; INFO: 'INFO'; NOTICE: 'NOTICE'; WARNING: 'WARNING'; EXCEPTION: 'EXCEPTION'; ASSERT: 'ASSERT'; LOOP: 'LOOP'; OPEN: 'OPEN'; FORMAT: 'FORMAT'; Identifier: IdentifierStartChar IdentifierChar*; fragment IdentifierStartChar options { caseInsensitive = false; }: // these are the valid identifier start characters below 0x7F [a-zA-Z_] | // these are the valid characters from 0x80 to 0xFF [\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF] | // these are the letters above 0xFF which only need a single UTF-16 code unit [\u0100-\uD7FF\uE000-\uFFFF] {this.CharIsLetter()}? | // letters which require multiple UTF-16 code units [\uD800-\uDBFF] [\uDC00-\uDFFF] {this.CheckIfUtf32Letter()}? ; fragment IdentifierChar: StrictIdentifierChar | '$'; fragment StrictIdentifierChar: IdentifierStartChar | [0-9]; /* Quoted Identifiers * * These are divided into four separate tokens, allowing distinction of valid quoted identifiers from invalid quoted * identifiers without sacrificing the ability of the lexer to reliably recover from lexical errors in the input. */ QuotedIdentifier: UnterminatedQuotedIdentifier '"'; // This is a quoted identifier which only contains valid characters but is not terminated UnterminatedQuotedIdentifier: '"' ('""' | ~ [\u0000"])*; // This is a quoted identifier which is terminated but contains a \u0000 character InvalidQuotedIdentifier: InvalidUnterminatedQuotedIdentifier '"'; // This is a quoted identifier which is unterminated and contains a \u0000 character InvalidUnterminatedQuotedIdentifier: '"' ('""' | ~ '"')*; /* Unicode Quoted Identifiers * * These are divided into four separate tokens, allowing distinction of valid Unicode quoted identifiers from invalid * Unicode quoted identifiers without sacrificing the ability of the lexer to reliably recover from lexical errors in * the input. Note that escape sequences are never checked as part of this determination due to the ability of users * to change the escape character with a UESCAPE clause following the Unicode quoted identifier. * * TODO: these rules assume "" is still a valid escape sequence within a Unicode quoted identifier. */ UnicodeQuotedIdentifier: 'U' '&' QuotedIdentifier; // This is a Unicode quoted identifier which only contains valid characters but is not terminated UnterminatedUnicodeQuotedIdentifier: 'U' '&' UnterminatedQuotedIdentifier; // This is a Unicode quoted identifier which is terminated but contains a \u0000 character InvalidUnicodeQuotedIdentifier: 'U' '&' InvalidQuotedIdentifier; // This is a Unicode quoted identifier which is unterminated and contains a \u0000 character InvalidUnterminatedUnicodeQuotedIdentifier: 'U' '&' InvalidUnterminatedQuotedIdentifier; // // CONSTANTS (4.1.2) // // String Constants (4.1.2.1) StringConstant: UnterminatedStringConstant '\''; UnterminatedStringConstant: '\'' ('\'\'' | ~ '\'')*; // String Constants with C-style Escapes (4.1.2.2) BeginEscapeStringConstant: 'E' '\'' -> more, pushMode (EscapeStringConstantMode); // String Constants with Unicode Escapes (4.1.2.3) // // Note that escape sequences are never checked as part of this token due to the ability of users to change the escape // character with a UESCAPE clause following the Unicode string constant. // // TODO: these rules assume '' is still a valid escape sequence within a Unicode string constant. UnicodeEscapeStringConstant: UnterminatedUnicodeEscapeStringConstant '\''; UnterminatedUnicodeEscapeStringConstant: 'U' '&' UnterminatedStringConstant; // Dollar-quoted String Constants (4.1.2.4) BeginDollarStringConstant: '$' Tag? '$' {this.PushTag();} -> pushMode (DollarQuotedStringMode); /* "The tag, if any, of a dollar-quoted string follows the same rules as an * unquoted identifier, except that it cannot contain a dollar sign." */ fragment Tag: IdentifierStartChar StrictIdentifierChar*; // Bit-strings Constants (4.1.2.5) BinaryStringConstant: UnterminatedBinaryStringConstant '\''; UnterminatedBinaryStringConstant: 'B' '\'' [01]*; InvalidBinaryStringConstant: InvalidUnterminatedBinaryStringConstant '\''; InvalidUnterminatedBinaryStringConstant: 'B' UnterminatedStringConstant; HexadecimalStringConstant: UnterminatedHexadecimalStringConstant '\''; UnterminatedHexadecimalStringConstant: 'X' '\'' [0-9A-F]*; InvalidHexadecimalStringConstant: InvalidUnterminatedHexadecimalStringConstant '\''; InvalidUnterminatedHexadecimalStringConstant: 'X' UnterminatedStringConstant; // Numeric Constants (4.1.2.6) Integral: Digits; NumericFail: Digits '..' {this.HandleNumericFail();}; Numeric: Digits '.' Digits? /*? replaced with + to solve problem with DOT_DOT .. but this surely must be rewriten */ ( 'E' [+-]? Digits )? | '.' Digits ('E' [+-]? Digits)? | Digits 'E' [+-]? Digits ; fragment Digits: [0-9]+; PLSQLVARIABLENAME: ':' [A-Z_] [A-Z_0-9$]*; PLSQLIDENTIFIER: ':"' ('\\' . | '""' | ~ ('"' | '\\'))* '"'; // // WHITESPACE (4.1) // Whitespace: [ \t]+ -> channel (HIDDEN); Newline: ('\r' '\n'? | '\n') -> channel (HIDDEN); // // COMMENTS (4.1.5) // LineComment: '--' ~ [\r\n]* -> channel (HIDDEN); BlockComment: ('/*' ('/'* BlockComment | ~ [/*] | '/'+ ~ [/*] | '*'+ ~ [/*])* '*'* '*/') -> channel (HIDDEN) ; UnterminatedBlockComment: '/*' ( '/'* BlockComment | // these characters are not part of special sequences in a block comment ~ [/*] | // handle / or * characters which are not part of /* or */ and do not appear at the end of the file ('/'+ ~ [/*] | '*'+ ~ [/*]) )* // Handle the case of / or * characters at the end of the file, or a nested unterminated block comment ('/'+ | '*'+ | '/'* UnterminatedBlockComment)? // Optional assertion to make sure this rule is working as intended {this.UnterminatedBlockCommentDebugAssert();} ; // // META-COMMANDS // // http://www.postgresql.org/docs/9.3/static/app-psql.html MetaCommand: '\\' -> pushMode(META), more ; // // ERROR // // Any character which does not match one of the above rules will appear in the token stream as an ErrorCharacter token. // This ensures the lexer itself will never encounter a syntax error, so all error handling may be performed by the // parser. ErrorCharacter: .; mode EscapeStringConstantMode; EscapeStringConstant: EscapeStringText '\'' -> mode (AfterEscapeStringConstantMode); UnterminatedEscapeStringConstant: EscapeStringText // Handle a final unmatched \ character appearing at the end of the file '\\'? EOF ; fragment EscapeStringText options { caseInsensitive = false; }: ( '\'\'' | '\\' ( // two-digit hex escapes are still valid when treated as single-digit escapes 'x' [0-9a-fA-F] | 'u' [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] | 'U' [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] | // Any character other than the Unicode escapes can follow a backslash. Some have special meaning, // but that doesn't affect the syntax. ~ [xuU] ) | ~ ['\\] )* ; InvalidEscapeStringConstant: InvalidEscapeStringText '\'' -> mode (AfterEscapeStringConstantMode); InvalidUnterminatedEscapeStringConstant: InvalidEscapeStringText // Handle a final unmatched \ character appearing at the end of the file '\\'? EOF ; fragment InvalidEscapeStringText: ('\'\'' | '\\' . | ~ ['\\])*; mode AfterEscapeStringConstantMode; AfterEscapeStringConstantMode_Whitespace: Whitespace -> type (Whitespace), channel (HIDDEN); AfterEscapeStringConstantMode_Newline: Newline -> type (Newline), channel (HIDDEN), mode (AfterEscapeStringConstantWithNewlineMode) ; AfterEscapeStringConstantMode_NotContinued: -> skip, popMode ; mode AfterEscapeStringConstantWithNewlineMode; AfterEscapeStringConstantWithNewlineMode_Whitespace: Whitespace -> type (Whitespace), channel (HIDDEN) ; AfterEscapeStringConstantWithNewlineMode_Newline: Newline -> type (Newline), channel (HIDDEN); AfterEscapeStringConstantWithNewlineMode_Continued: '\'' -> more, mode (EscapeStringConstantMode) ; AfterEscapeStringConstantWithNewlineMode_NotContinued: -> skip, popMode ; mode DollarQuotedStringMode; DollarText: ~ '$'+ //| '$'([0-9])+ | // this alternative improves the efficiency of handling $ characters within a dollar-quoted string which are // not part of the ending tag. '$' ~ '$'* ; // NB: Next rule on two lines in order to make transformGrammar.py easy. EndDollarStringConstant: ('$' Tag? '$') {this.IsTag()}? {this.PopTag();} -> popMode; mode META; MetaSemi : {this.IsSemiColon()}? ';' -> type(SEMI), popMode ; MetaOther : ~[;\r\n\\"] .*? ('\\\\' | [\r\n]+) -> type(SEMI), popMode ;