528 lines
12 KiB
ANTLR
Executable File
528 lines
12 KiB
ANTLR
Executable File
/**
|
|
* Kotlin lexical grammar in ANTLR4 notation
|
|
*/
|
|
|
|
lexer grammar KotlinLexer;
|
|
|
|
import UnicodeClasses;
|
|
|
|
// SECTION: lexicalGeneral
|
|
|
|
ShebangLine
|
|
: '#!' ~[\r\n]*
|
|
;
|
|
|
|
DelimitedComment
|
|
: '/*' ( DelimitedComment | . )*? '*/'
|
|
-> channel(HIDDEN)
|
|
;
|
|
|
|
LineComment
|
|
: '//' ~[\r\n]*
|
|
-> channel(HIDDEN)
|
|
;
|
|
|
|
WS
|
|
: [\u0020\u0009\u000C]
|
|
-> channel(HIDDEN)
|
|
;
|
|
|
|
NL: '\n' | '\r' '\n'?;
|
|
|
|
fragment Hidden: DelimitedComment | LineComment | WS;
|
|
|
|
// SECTION: separatorsAndOperations
|
|
|
|
RESERVED: '...';
|
|
DOT: '.';
|
|
COMMA: ',';
|
|
LPAREN: '(' -> pushMode(Inside);
|
|
RPAREN: ')';
|
|
LSQUARE: '[' -> pushMode(Inside);
|
|
RSQUARE: ']';
|
|
LCURL: '{' -> pushMode(DEFAULT_MODE);
|
|
/*
|
|
* When using another programming language (not Java) to generate a parser,
|
|
* please replace this code with the corresponding code of a programming language you are using.
|
|
*/
|
|
RCURL: '}' { if (!_modeStack.isEmpty()) { popMode(); } };
|
|
MULT: '*';
|
|
MOD: '%';
|
|
DIV: '/';
|
|
ADD: '+';
|
|
SUB: '-';
|
|
INCR: '++';
|
|
DECR: '--';
|
|
CONJ: '&&';
|
|
DISJ: '||';
|
|
EXCL_WS: '!' Hidden;
|
|
EXCL_NO_WS: '!';
|
|
COLON: ':';
|
|
SEMICOLON: ';';
|
|
ASSIGNMENT: '=';
|
|
ADD_ASSIGNMENT: '+=';
|
|
SUB_ASSIGNMENT: '-=';
|
|
MULT_ASSIGNMENT: '*=';
|
|
DIV_ASSIGNMENT: '/=';
|
|
MOD_ASSIGNMENT: '%=';
|
|
ARROW: '->';
|
|
DOUBLE_ARROW: '=>';
|
|
RANGE: '..';
|
|
COLONCOLON: '::';
|
|
DOUBLE_SEMICOLON: ';;';
|
|
HASH: '#';
|
|
AT_NO_WS: '@';
|
|
AT_POST_WS: '@' (Hidden | NL);
|
|
AT_PRE_WS: (Hidden | NL) '@' ;
|
|
AT_BOTH_WS: (Hidden | NL) '@' (Hidden | NL);
|
|
QUEST_WS: '?' Hidden;
|
|
QUEST_NO_WS: '?';
|
|
LANGLE: '<';
|
|
RANGLE: '>';
|
|
LE: '<=';
|
|
GE: '>=';
|
|
EXCL_EQ: '!=';
|
|
EXCL_EQEQ: '!==';
|
|
AS_SAFE: 'as?';
|
|
EQEQ: '==';
|
|
EQEQEQ: '===';
|
|
SINGLE_QUOTE: '\'';
|
|
AMP: '&';
|
|
|
|
// SECTION: keywords
|
|
|
|
RETURN_AT: 'return@' Identifier;
|
|
CONTINUE_AT: 'continue@' Identifier;
|
|
BREAK_AT: 'break@' Identifier;
|
|
|
|
THIS_AT: 'this@' Identifier;
|
|
SUPER_AT: 'super@' Identifier;
|
|
|
|
FILE: 'file';
|
|
FIELD: 'field';
|
|
PROPERTY: 'property';
|
|
GET: 'get';
|
|
SET: 'set';
|
|
RECEIVER: 'receiver';
|
|
PARAM: 'param';
|
|
SETPARAM: 'setparam';
|
|
DELEGATE: 'delegate';
|
|
|
|
PACKAGE: 'package';
|
|
IMPORT: 'import';
|
|
CLASS: 'class';
|
|
INTERFACE: 'interface';
|
|
FUN: 'fun';
|
|
OBJECT: 'object';
|
|
VAL: 'val';
|
|
VAR: 'var';
|
|
TYPE_ALIAS: 'typealias';
|
|
CONSTRUCTOR: 'constructor';
|
|
BY: 'by';
|
|
COMPANION: 'companion';
|
|
INIT: 'init';
|
|
THIS: 'this';
|
|
SUPER: 'super';
|
|
TYPEOF: 'typeof';
|
|
WHERE: 'where';
|
|
IF: 'if';
|
|
ELSE: 'else';
|
|
WHEN: 'when';
|
|
TRY: 'try';
|
|
CATCH: 'catch';
|
|
FINALLY: 'finally';
|
|
FOR: 'for';
|
|
DO: 'do';
|
|
WHILE: 'while';
|
|
THROW: 'throw';
|
|
RETURN: 'return';
|
|
CONTINUE: 'continue';
|
|
BREAK: 'break';
|
|
AS: 'as';
|
|
IS: 'is';
|
|
IN: 'in';
|
|
NOT_IS: '!is' (Hidden | NL);
|
|
NOT_IN: '!in' (Hidden | NL);
|
|
OUT: 'out';
|
|
DYNAMIC: 'dynamic';
|
|
|
|
// SECTION: lexicalModifiers
|
|
|
|
PUBLIC: 'public';
|
|
PRIVATE: 'private';
|
|
PROTECTED: 'protected';
|
|
INTERNAL: 'internal';
|
|
ENUM: 'enum';
|
|
SEALED: 'sealed';
|
|
ANNOTATION: 'annotation';
|
|
DATA: 'data';
|
|
INNER: 'inner';
|
|
VALUE: 'value';
|
|
TAILREC: 'tailrec';
|
|
OPERATOR: 'operator';
|
|
INLINE: 'inline';
|
|
INFIX: 'infix';
|
|
EXTERNAL: 'external';
|
|
SUSPEND: 'suspend';
|
|
OVERRIDE: 'override';
|
|
ABSTRACT: 'abstract';
|
|
FINAL: 'final';
|
|
OPEN: 'open';
|
|
CONST: 'const';
|
|
LATEINIT: 'lateinit';
|
|
VARARG: 'vararg';
|
|
NOINLINE: 'noinline';
|
|
CROSSINLINE: 'crossinline';
|
|
REIFIED: 'reified';
|
|
EXPECT: 'expect';
|
|
ACTUAL: 'actual';
|
|
|
|
// SECTION: literals
|
|
|
|
fragment DecDigit: '0'..'9';
|
|
fragment DecDigitNoZero: '1'..'9';
|
|
fragment DecDigitOrSeparator: DecDigit | '_';
|
|
|
|
fragment DecDigits
|
|
: DecDigit DecDigitOrSeparator* DecDigit
|
|
| DecDigit
|
|
;
|
|
|
|
fragment DoubleExponent: [eE] [+-]? DecDigits;
|
|
|
|
RealLiteral
|
|
: FloatLiteral
|
|
| DoubleLiteral
|
|
;
|
|
|
|
FloatLiteral
|
|
: DoubleLiteral [fF]
|
|
| DecDigits [fF]
|
|
;
|
|
|
|
DoubleLiteral
|
|
: DecDigits? '.' DecDigits DoubleExponent?
|
|
| DecDigits DoubleExponent
|
|
;
|
|
|
|
IntegerLiteral
|
|
: DecDigitNoZero DecDigitOrSeparator* DecDigit
|
|
| DecDigit
|
|
;
|
|
|
|
fragment HexDigit: [0-9a-fA-F];
|
|
fragment HexDigitOrSeparator: HexDigit | '_';
|
|
|
|
HexLiteral
|
|
: '0' [xX] HexDigit HexDigitOrSeparator* HexDigit
|
|
| '0' [xX] HexDigit
|
|
;
|
|
|
|
fragment BinDigit: [01];
|
|
fragment BinDigitOrSeparator: BinDigit | '_';
|
|
|
|
BinLiteral
|
|
: '0' [bB] BinDigit BinDigitOrSeparator* BinDigit
|
|
| '0' [bB] BinDigit
|
|
;
|
|
|
|
UnsignedLiteral
|
|
: (IntegerLiteral | HexLiteral | BinLiteral) [uU] [lL]?
|
|
;
|
|
|
|
LongLiteral
|
|
: (IntegerLiteral | HexLiteral | BinLiteral) [lL]
|
|
;
|
|
|
|
BooleanLiteral: 'true'| 'false';
|
|
|
|
NullLiteral: 'null';
|
|
|
|
CharacterLiteral
|
|
: '\'' (EscapeSeq | ~[\n\r'\\]) '\''
|
|
;
|
|
|
|
// SECTION: lexicalIdentifiers
|
|
|
|
fragment UnicodeDigit: UNICODE_CLASS_ND;
|
|
|
|
Identifier
|
|
: (Letter | '_') (Letter | '_' | UnicodeDigit)*
|
|
| '`' ~([\r\n] | '`')+ '`'
|
|
;
|
|
|
|
IdentifierOrSoftKey
|
|
: Identifier
|
|
/* Soft keywords */
|
|
| ABSTRACT
|
|
| ANNOTATION
|
|
| BY
|
|
| CATCH
|
|
| COMPANION
|
|
| CONSTRUCTOR
|
|
| CROSSINLINE
|
|
| DATA
|
|
| DYNAMIC
|
|
| ENUM
|
|
| EXTERNAL
|
|
| FINAL
|
|
| FINALLY
|
|
| IMPORT
|
|
| INFIX
|
|
| INIT
|
|
| INLINE
|
|
| INNER
|
|
| INTERNAL
|
|
| LATEINIT
|
|
| NOINLINE
|
|
| OPEN
|
|
| OPERATOR
|
|
| OUT
|
|
| OVERRIDE
|
|
| PRIVATE
|
|
| PROTECTED
|
|
| PUBLIC
|
|
| REIFIED
|
|
| SEALED
|
|
| TAILREC
|
|
| VARARG
|
|
| WHERE
|
|
| GET
|
|
| SET
|
|
| FIELD
|
|
| PROPERTY
|
|
| RECEIVER
|
|
| PARAM
|
|
| SETPARAM
|
|
| DELEGATE
|
|
| FILE
|
|
| EXPECT
|
|
| ACTUAL
|
|
| VALUE
|
|
/* Strong keywords */
|
|
| CONST
|
|
| SUSPEND
|
|
;
|
|
|
|
FieldIdentifier
|
|
: '$' IdentifierOrSoftKey
|
|
;
|
|
|
|
fragment UniCharacterLiteral
|
|
: '\\' 'u' HexDigit HexDigit HexDigit HexDigit
|
|
;
|
|
|
|
fragment EscapedIdentifier
|
|
: '\\' ('t' | 'b' | 'r' | 'n' | '\'' | '"' | '\\' | '$')
|
|
;
|
|
|
|
fragment EscapeSeq
|
|
: UniCharacterLiteral
|
|
| EscapedIdentifier
|
|
;
|
|
|
|
// SECTION: characters
|
|
|
|
fragment Letter
|
|
: UNICODE_CLASS_LU
|
|
| UNICODE_CLASS_LL
|
|
| UNICODE_CLASS_LT
|
|
| UNICODE_CLASS_LM
|
|
| UNICODE_CLASS_LO
|
|
;
|
|
|
|
// SECTION: strings
|
|
|
|
QUOTE_OPEN: '"' -> pushMode(LineString);
|
|
|
|
TRIPLE_QUOTE_OPEN: '"""' -> pushMode(MultiLineString);
|
|
|
|
mode LineString;
|
|
|
|
QUOTE_CLOSE
|
|
: '"' -> popMode
|
|
;
|
|
|
|
LineStrRef
|
|
: FieldIdentifier
|
|
;
|
|
|
|
LineStrText
|
|
: ~('\\' | '"' | '$')+ | '$'
|
|
;
|
|
|
|
LineStrEscapedChar
|
|
: EscapedIdentifier
|
|
| UniCharacterLiteral
|
|
;
|
|
|
|
LineStrExprStart
|
|
: '${' -> pushMode(DEFAULT_MODE)
|
|
;
|
|
|
|
mode MultiLineString;
|
|
|
|
TRIPLE_QUOTE_CLOSE
|
|
: MultiLineStringQuote? '"""' -> popMode
|
|
;
|
|
|
|
MultiLineStringQuote
|
|
: '"'+
|
|
;
|
|
|
|
MultiLineStrRef
|
|
: FieldIdentifier
|
|
;
|
|
|
|
MultiLineStrText
|
|
: ~('"' | '$')+ | '$'
|
|
;
|
|
|
|
MultiLineStrExprStart
|
|
: '${' -> pushMode(DEFAULT_MODE)
|
|
;
|
|
|
|
// SECTION: inside
|
|
|
|
mode Inside;
|
|
|
|
Inside_RPAREN: RPAREN -> popMode, type(RPAREN);
|
|
Inside_RSQUARE: RSQUARE -> popMode, type(RSQUARE);
|
|
Inside_LPAREN: LPAREN -> pushMode(Inside), type(LPAREN);
|
|
Inside_LSQUARE: LSQUARE -> pushMode(Inside), type(LSQUARE);
|
|
Inside_LCURL: LCURL -> pushMode(DEFAULT_MODE), type(LCURL);
|
|
Inside_RCURL: RCURL -> popMode, type(RCURL);
|
|
|
|
Inside_DOT: DOT -> type(DOT);
|
|
Inside_COMMA: COMMA -> type(COMMA);
|
|
Inside_MULT: MULT -> type(MULT);
|
|
Inside_MOD: MOD -> type(MOD);
|
|
Inside_DIV: DIV -> type(DIV);
|
|
Inside_ADD: ADD -> type(ADD);
|
|
Inside_SUB: SUB -> type(SUB);
|
|
Inside_INCR: INCR -> type(INCR);
|
|
Inside_DECR: DECR -> type(DECR);
|
|
Inside_CONJ: CONJ -> type(CONJ);
|
|
Inside_DISJ: DISJ -> type(DISJ);
|
|
Inside_EXCL_WS: '!' (Hidden|NL) -> type(EXCL_WS);
|
|
Inside_EXCL_NO_WS: EXCL_NO_WS -> type(EXCL_NO_WS);
|
|
Inside_COLON: COLON -> type(COLON);
|
|
Inside_SEMICOLON: SEMICOLON -> type(SEMICOLON);
|
|
Inside_ASSIGNMENT: ASSIGNMENT -> type(ASSIGNMENT);
|
|
Inside_ADD_ASSIGNMENT: ADD_ASSIGNMENT -> type(ADD_ASSIGNMENT);
|
|
Inside_SUB_ASSIGNMENT: SUB_ASSIGNMENT -> type(SUB_ASSIGNMENT);
|
|
Inside_MULT_ASSIGNMENT: MULT_ASSIGNMENT -> type(MULT_ASSIGNMENT);
|
|
Inside_DIV_ASSIGNMENT: DIV_ASSIGNMENT -> type(DIV_ASSIGNMENT);
|
|
Inside_MOD_ASSIGNMENT: MOD_ASSIGNMENT -> type(MOD_ASSIGNMENT);
|
|
Inside_ARROW: ARROW -> type(ARROW);
|
|
Inside_DOUBLE_ARROW: DOUBLE_ARROW -> type(DOUBLE_ARROW);
|
|
Inside_RANGE: RANGE -> type(RANGE);
|
|
Inside_RESERVED: RESERVED -> type(RESERVED);
|
|
Inside_COLONCOLON: COLONCOLON -> type(COLONCOLON);
|
|
Inside_DOUBLE_SEMICOLON: DOUBLE_SEMICOLON -> type(DOUBLE_SEMICOLON);
|
|
Inside_HASH: HASH -> type(HASH);
|
|
Inside_AT_NO_WS: AT_NO_WS -> type(AT_NO_WS);
|
|
Inside_AT_POST_WS: AT_POST_WS -> type(AT_POST_WS);
|
|
Inside_AT_PRE_WS: AT_PRE_WS -> type(AT_PRE_WS);
|
|
Inside_AT_BOTH_WS: AT_BOTH_WS -> type(AT_BOTH_WS);
|
|
Inside_QUEST_WS: '?' (Hidden | NL) -> type(QUEST_WS);
|
|
Inside_QUEST_NO_WS: QUEST_NO_WS -> type(QUEST_NO_WS);
|
|
Inside_LANGLE: LANGLE -> type(LANGLE);
|
|
Inside_RANGLE: RANGLE -> type(RANGLE);
|
|
Inside_LE: LE -> type(LE);
|
|
Inside_GE: GE -> type(GE);
|
|
Inside_EXCL_EQ: EXCL_EQ -> type(EXCL_EQ);
|
|
Inside_EXCL_EQEQ: EXCL_EQEQ -> type(EXCL_EQEQ);
|
|
Inside_IS: IS -> type(IS);
|
|
Inside_NOT_IS: NOT_IS -> type(NOT_IS);
|
|
Inside_NOT_IN: NOT_IN -> type(NOT_IN);
|
|
Inside_AS: AS -> type(AS);
|
|
Inside_AS_SAFE: AS_SAFE -> type(AS_SAFE);
|
|
Inside_EQEQ: EQEQ -> type(EQEQ);
|
|
Inside_EQEQEQ: EQEQEQ -> type(EQEQEQ);
|
|
Inside_SINGLE_QUOTE: SINGLE_QUOTE -> type(SINGLE_QUOTE);
|
|
Inside_AMP: AMP -> type(AMP);
|
|
Inside_QUOTE_OPEN: QUOTE_OPEN -> pushMode(LineString), type(QUOTE_OPEN);
|
|
Inside_TRIPLE_QUOTE_OPEN: TRIPLE_QUOTE_OPEN -> pushMode(MultiLineString), type(TRIPLE_QUOTE_OPEN);
|
|
|
|
Inside_VAL: VAL -> type(VAL);
|
|
Inside_VAR: VAR -> type(VAR);
|
|
Inside_FUN: FUN -> type(FUN);
|
|
Inside_OBJECT: OBJECT -> type(OBJECT);
|
|
Inside_SUPER: SUPER -> type(SUPER);
|
|
Inside_IN: IN -> type(IN);
|
|
Inside_OUT: OUT -> type(OUT);
|
|
Inside_FIELD: FIELD -> type(FIELD);
|
|
Inside_FILE: FILE -> type(FILE);
|
|
Inside_PROPERTY: PROPERTY -> type(PROPERTY);
|
|
Inside_GET: GET -> type(GET);
|
|
Inside_SET: SET -> type(SET);
|
|
Inside_RECEIVER: RECEIVER -> type(RECEIVER);
|
|
Inside_PARAM: PARAM -> type(PARAM);
|
|
Inside_SETPARAM: SETPARAM -> type(SETPARAM);
|
|
Inside_DELEGATE: DELEGATE -> type(DELEGATE);
|
|
Inside_THROW: THROW -> type(THROW);
|
|
Inside_RETURN: RETURN -> type(RETURN);
|
|
Inside_CONTINUE: CONTINUE -> type(CONTINUE);
|
|
Inside_BREAK: BREAK -> type(BREAK);
|
|
Inside_RETURN_AT: RETURN_AT -> type(RETURN_AT);
|
|
Inside_CONTINUE_AT: CONTINUE_AT -> type(CONTINUE_AT);
|
|
Inside_BREAK_AT: BREAK_AT -> type(BREAK_AT);
|
|
Inside_IF: IF -> type(IF);
|
|
Inside_ELSE: ELSE -> type(ELSE);
|
|
Inside_WHEN: WHEN -> type(WHEN);
|
|
Inside_TRY: TRY -> type(TRY);
|
|
Inside_CATCH: CATCH -> type(CATCH);
|
|
Inside_FINALLY: FINALLY -> type(FINALLY);
|
|
Inside_FOR: FOR -> type(FOR);
|
|
Inside_DO: DO -> type(DO);
|
|
Inside_WHILE: WHILE -> type(WHILE);
|
|
|
|
Inside_PUBLIC: PUBLIC -> type(PUBLIC);
|
|
Inside_PRIVATE: PRIVATE -> type(PRIVATE);
|
|
Inside_PROTECTED: PROTECTED -> type(PROTECTED);
|
|
Inside_INTERNAL: INTERNAL -> type(INTERNAL);
|
|
Inside_ENUM: ENUM -> type(ENUM);
|
|
Inside_SEALED: SEALED -> type(SEALED);
|
|
Inside_ANNOTATION: ANNOTATION -> type(ANNOTATION);
|
|
Inside_DATA: DATA -> type(DATA);
|
|
Inside_INNER: INNER -> type(INNER);
|
|
Inside_VALUE: VALUE -> type(VALUE);
|
|
Inside_TAILREC: TAILREC -> type(TAILREC);
|
|
Inside_OPERATOR: OPERATOR -> type(OPERATOR);
|
|
Inside_INLINE: INLINE -> type(INLINE);
|
|
Inside_INFIX: INFIX -> type(INFIX);
|
|
Inside_EXTERNAL: EXTERNAL -> type(EXTERNAL);
|
|
Inside_SUSPEND: SUSPEND -> type(SUSPEND);
|
|
Inside_OVERRIDE: OVERRIDE -> type(OVERRIDE);
|
|
Inside_ABSTRACT: ABSTRACT -> type(ABSTRACT);
|
|
Inside_FINAL: FINAL -> type(FINAL);
|
|
Inside_OPEN: OPEN -> type(OPEN);
|
|
Inside_CONST: CONST -> type(CONST);
|
|
Inside_LATEINIT: LATEINIT -> type(LATEINIT);
|
|
Inside_VARARG: VARARG -> type(VARARG);
|
|
Inside_NOINLINE: NOINLINE -> type(NOINLINE);
|
|
Inside_CROSSINLINE: CROSSINLINE -> type(CROSSINLINE);
|
|
Inside_REIFIED: REIFIED -> type(REIFIED);
|
|
Inside_EXPECT: EXPECT -> type(EXPECT);
|
|
Inside_ACTUAL: ACTUAL -> type(ACTUAL);
|
|
|
|
Inside_BooleanLiteral: BooleanLiteral -> type(BooleanLiteral);
|
|
Inside_IntegerLiteral: IntegerLiteral -> type(IntegerLiteral);
|
|
Inside_HexLiteral: HexLiteral -> type(HexLiteral);
|
|
Inside_BinLiteral: BinLiteral -> type(BinLiteral);
|
|
Inside_CharacterLiteral: CharacterLiteral -> type(CharacterLiteral);
|
|
Inside_RealLiteral: RealLiteral -> type(RealLiteral);
|
|
Inside_NullLiteral: NullLiteral -> type(NullLiteral);
|
|
Inside_LongLiteral: LongLiteral -> type(LongLiteral);
|
|
Inside_UnsignedLiteral: UnsignedLiteral -> type(UnsignedLiteral);
|
|
|
|
Inside_Identifier: Identifier -> type(Identifier);
|
|
Inside_Comment: (LineComment | DelimitedComment) -> channel(HIDDEN);
|
|
Inside_WS: WS -> channel(HIDDEN);
|
|
Inside_NL: NL -> channel(HIDDEN);
|
|
|
|
mode DEFAULT_MODE;
|
|
|
|
ErrorCharacter: .;
|