语法
Description
Notation
The notation used on this page corresponds to the ANTLR 4 notation with a few exceptions for better readability:
- omitted lexer rule actions and commands,
- omitted lexical modes.
Short description:
- operator
|
denotes alternative, - operator
*
denotes iteration (zero or more), - operator
+
denotes iteration (one or more), - operator
?
denotes option (zero or one), - operator
..
denotes range (from left to right), - operator
~
denotes negation.
Grammar source files
Kotlin grammar source files (in ANTLR format) are located in the Kotlin specification repository:
- KotlinLexer.g4 describes lexical structure;
- UnicodeClasses.g4 describes the characters that can be used in identifiers (these rules are omitted on this page for better readability);
- KotlinParser.g4 describes syntax.
The grammar on this page corresponds to the grammar files above.
Symbols and naming
Terminal symbol names start with an uppercase letter, e.g. Identifier.
Non-terminal symbol names start with a lowercase letter, e.g. kotlinFile.
Symbol definitions may be documented with attributes:
start
attribute denotes a symbol that represents the whole source file (see kotlinFile and script),helper
attribute denotes a lexer fragment rule (used only inside other terminal symbols).
Also for better readability some simplifications are made:
- lexer rules consisting of one string literal element are inlined to the use site,
- new line tokens are excluded (new lines are not allowed in some places, see source grammar files for details).
Scope
The grammar corresponds to the latest stable version of the Kotlin compiler excluding lexer and parser rules for experimental features that are disabled by default.
Syntax grammar
General
Relevant pages: Packages
start
kotlinFile
: shebangLine? fileAnnotation* packageHeader importList topLevelObject* EOF
;
start
script
: shebangLine? fileAnnotation* packageHeader importList (statement semi)* EOF
;
shebangLine
(used by kotlinFile, script)
: ShebangLine
;
fileAnnotation
(used by kotlinFile, script)
: ANNOTATION_USE_SITE_TARGET_FILE ((‘[‘ unescapedAnnotation+ ‘]‘) | unescapedAnnotation)
;
See Packages
packageHeader
(used by kotlinFile, script)
: (‘package’ identifier semi?)?
;
See Imports
importList
(used by kotlinFile, script)
: importHeader*
;
importHeader
(used by importList)
: ‘import’ identifier ((‘.’ ‘*‘) | importAlias)? semi?
;
importAlias
(used by importHeader)
: ‘as’ simpleIdentifier
;
topLevelObject
(used by kotlinFile)
: declaration semis?
;
typeAlias
(used by declaration)
: modifiers? ‘typealias’ simpleIdentifier typeParameters? ‘=’ type
;
declaration
(used by topLevelObject, classMemberDeclaration, statement)
: classDeclaration
| objectDeclaration
| functionDeclaration
| propertyDeclaration
| typeAlias
;
Classes
classDeclaration
(used by declaration)
: modifiers? (‘class’ | ‘interface’)
simpleIdentifier typeParameters?
primaryConstructor?
(‘:’ delegationSpecifiers)?
typeConstraints?
(classBody | enumClassBody)?
;
primaryConstructor
(used by classDeclaration)
: (modifiers? ‘constructor’)? classParameters
;
classBody
(used by classDeclaration, companionObject, objectDeclaration, enumEntry, objectLiteral)
: ‘{‘ classMemberDeclarations ‘}’
;
classParameters
(used by primaryConstructor)
: ‘(‘ (classParameter (‘,’ classParameter)*)? ‘)’
;
classParameter
(used by classParameters)
: modifiers? (‘val’ | ‘var’)? simpleIdentifier ‘:’ type (‘=’ expression)?
;
delegationSpecifiers
(used by classDeclaration, companionObject, objectDeclaration, objectLiteral)
: annotatedDelegationSpecifier (‘,’ annotatedDelegationSpecifier)*
;
delegationSpecifier
(used by annotatedDelegationSpecifier)
: constructorInvocation
| explicitDelegation
| userType
| functionType
;
constructorInvocation
(used by delegationSpecifier, unescapedAnnotation)
annotatedDelegationSpecifier
(used by delegationSpecifiers)
: annotation* delegationSpecifier
;
explicitDelegation
(used by delegationSpecifier)
: (userType | functionType) ‘by’ expression
;
See Generic classes
typeParameters
(used by typeAlias, classDeclaration, functionDeclaration, propertyDeclaration)
: ‘<’ typeParameter (‘,’ typeParameter)* ‘>’
;
typeParameter
(used by typeParameters)
: typeParameterModifiers? simpleIdentifier (‘:’ type)?
;
typeConstraints
(used by classDeclaration, functionDeclaration, propertyDeclaration, anonymousFunction)
: ‘where’ typeConstraint (‘,’ typeConstraint)*
;
typeConstraint
(used by typeConstraints)
: annotation* simpleIdentifier ‘:’ type
;
Class members
classMemberDeclarations
(used by classBody, enumClassBody)
: (classMemberDeclaration semis?)*
;
classMemberDeclaration
(used by classMemberDeclarations)
: declaration
| companionObject
| anonymousInitializer
| secondaryConstructor
;
anonymousInitializer
(used by classMemberDeclaration)
: ‘init’ block
;
companionObject
(used by classMemberDeclaration)
: modifiers? ‘companion’ ‘object’ simpleIdentifier?
(‘:’ delegationSpecifiers)?
classBody?
;
functionValueParameters
(used by functionDeclaration, secondaryConstructor, anonymousFunction)
: ‘(‘ (functionValueParameter (‘,’ functionValueParameter)*)? ‘)’
;
functionValueParameter
(used by functionValueParameters)
: modifiers? parameter (‘=’ expression)?
;
functionDeclaration
(used by declaration)
: modifiers? ‘fun’ typeParameters?
(receiverType ‘.’)?
simpleIdentifier functionValueParameters
(‘:’ type)? typeConstraints?
functionBody?
;
functionBody
(used by functionDeclaration, getter, setter, anonymousFunction)
: block
| ‘=’ expression
;
variableDeclaration
(used by multiVariableDeclaration, propertyDeclaration, forStatement, lambdaParameter, whenSubject)
: annotation* simpleIdentifier (‘:’ type)?
;
multiVariableDeclaration
(used by propertyDeclaration, forStatement, lambdaParameter)
: ‘(‘ variableDeclaration (‘,’ variableDeclaration)* ‘)’
;
propertyDeclaration
(used by declaration)
: modifiers? (‘val’ | ‘var’) typeParameters?
(receiverType ‘.’)?
(multiVariableDeclaration | variableDeclaration)
typeConstraints?
((‘=’ expression) | propertyDelegate)? ‘;’?
((getter? (semi? setter)?) | (setter? (semi? getter)?))
;
propertyDelegate
(used by propertyDeclaration)
: ‘by’ expression
;
getter
(used by propertyDeclaration)
: modifiers? ‘get’
| modifiers? ‘get’ ‘(‘ ‘)’
(‘:’ type)?
functionBody
;
setter
(used by propertyDeclaration)
: modifiers? ‘set’
| modifiers? ‘set’ ‘(‘ (annotation | parameterModifier)* setterParameter ‘)’
(‘:’ type)?
functionBody
;
setterParameter
(used by setter)
: simpleIdentifier (‘:’ type)?
;
parameter
(used by functionValueParameter, functionTypeParameters)
: simpleIdentifier ‘:’ type
;
See Object expressions and Declarations
objectDeclaration
(used by declaration)
: modifiers? ‘object’ simpleIdentifier (‘:’ delegationSpecifiers)? classBody?
;
secondaryConstructor
(used by classMemberDeclaration)
: modifiers? ‘constructor’ functionValueParameters
(‘:’ constructorDelegationCall)? block?
;
constructorDelegationCall
(used by secondaryConstructor)
: ‘this’ valueArguments
| ‘super’ valueArguments
;
Enum classes
See Enum classes
enumClassBody
(used by classDeclaration)
: ‘{‘ enumEntries? (‘;’ classMemberDeclarations)? ‘}’
;
enumEntries
(used by enumClassBody)
: enumEntry (‘,’ enumEntry)* ‘,’?
;
enumEntry
(used by enumEntries)
: modifiers? simpleIdentifier valueArguments? classBody?
;
Types
See Types
type
(used by typeAlias, classParameter, typeParameter, typeConstraint, functionDeclaration, variableDeclaration, getter, setter, setterParameter, parameter, typeProjection, functionType, functionTypeParameters, parenthesizedType, infixOperation, asExpression, lambdaParameter, anonymousFunction, superExpression, typeTest, catchBlock)
: typeModifiers? (parenthesizedType | nullableType | typeReference | functionType)
;
typeReference
(used by type, nullableType, receiverType)
: userType
| ‘dynamic’
;
nullableType
(used by type, receiverType)
: (typeReference | parenthesizedType) quest+
;
quest
(used by nullableType)
: ‘?’
| QUEST_WS
;
userType
(used by delegationSpecifier, constructorInvocation, explicitDelegation, typeReference, parenthesizedUserType, unescapedAnnotation)
: simpleUserType (‘.’ simpleUserType)*
;
simpleUserType
(used by userType)
: simpleIdentifier typeArguments?
;
typeProjection
(used by typeArguments)
: typeProjectionModifiers? type
| ‘*‘
;
typeProjectionModifiers
(used by typeProjection)
typeProjectionModifier
(used by typeProjectionModifiers)
: varianceModifier
| annotation
;
functionType
(used by delegationSpecifier, explicitDelegation, type)
: (receiverType ‘.’)? functionTypeParameters ‘->’ type
;
functionTypeParameters
(used by functionType)
: ‘(‘ (parameter | type)? (‘,’ (parameter | type))* ‘)’
;
parenthesizedType
(used by type, nullableType, receiverType)
: ‘(‘ type ‘)’
;
receiverType
(used by functionDeclaration, propertyDeclaration, functionType, callableReference)
: typeModifiers? (parenthesizedType | nullableType | typeReference)
;
parenthesizedUserType
(used by parenthesizedUserType)
: ‘(‘ userType ‘)’
| ‘(‘ parenthesizedUserType ‘)’
;
Statements
statements
(used by block, lambdaLiteral)
: (statement (semis statement)* semis?)?
;
statement
(used by script, statements, controlStructureBody)
: (label | annotation)* (declaration | assignment | loopStatement | expression)
;
label
(used by statement, unaryPrefix, annotatedLambda)
: IdentifierAt
;
controlStructureBody
(used by forStatement, whileStatement, doWhileStatement, ifExpression, whenEntry)
block
(used by anonymousInitializer, functionBody, secondaryConstructor, controlStructureBody, tryExpression, catchBlock, finallyBlock)
: ‘{‘ statements ‘}’
;
loopStatement
(used by statement)
: forStatement
| whileStatement
| doWhileStatement
;
forStatement
(used by loopStatement)
: ‘for’
‘(‘ annotation* (variableDeclaration | multiVariableDeclaration) ‘in’ expression ‘)’
controlStructureBody?
;
whileStatement
(used by loopStatement)
: ‘while’ ‘(‘ expression ‘)’ controlStructureBody
| ‘while’ ‘(‘ expression ‘)’ ‘;’
;
doWhileStatement
(used by loopStatement)
: ‘do’ controlStructureBody? ‘while’ ‘(‘ expression ‘)’
;
assignment
(used by statement)
: directlyAssignableExpression ‘=’ expression
| assignableExpression assignmentAndOperator expression
;
semi
(used by script, packageHeader, importHeader, propertyDeclaration, whenEntry)
: EOF
;
semis
(used by topLevelObject, classMemberDeclarations, statements)
: EOF
;
Expressions
Precedence | Title | Symbols |
---|---|---|
Highest | Postfix | ++ , — , . , ?. , ? |
Prefix | - , + , ++ , — , ! , label | |
Type RHS | : , as , as? | |
Multiplicative | , / , % | |
Additive | + , - | |
Range | .. | |
Infix function | simpleIdentifier | |
Elvis | ?: | |
Named checks | in , !in , is , !is | |
Comparison | < , > , <= , >= | |
Equality | == , !== | |
Conjunction | && | |
Disjunction | || | |
Spread operator |
| |
Lowest | Assignment | = , += , -= , *= , /= , %= |
expression
(used by classParameter, explicitDelegation, functionValueParameter, functionBody, propertyDeclaration, propertyDelegate, statement, forStatement, whileStatement, doWhileStatement, assignment, indexingSuffix, valueArgument, parenthesizedExpression, collectionLiteral, lineStringExpression, multiLineStringExpression, ifExpression, whenSubject, whenCondition, rangeTest, jumpExpression)
: disjunction
;
disjunction
(used by expression)
: conjunction (‘||’ conjunction)*
;
conjunction
(used by disjunction)
equality
(used by conjunction)
: comparison (equalityOperator comparison)*
;
comparison
(used by equality)
: infixOperation (comparisonOperator infixOperation)?
;
infixOperation
(used by comparison)
: elvisExpression ((inOperator elvisExpression) | (isOperator type))*
;
elvisExpression
(used by infixOperation)
: infixFunctionCall (elvis infixFunctionCall)*
;
elvis
(used by elvisExpression)
: ‘?’ ‘:’
;
infixFunctionCall
(used by elvisExpression)
: rangeExpression (simpleIdentifier rangeExpression)*
;
rangeExpression
(used by infixFunctionCall)
: additiveExpression (‘..’ additiveExpression)*
;
additiveExpression
(used by rangeExpression)
: multiplicativeExpression (additiveOperator multiplicativeExpression)*
;
multiplicativeExpression
(used by additiveExpression)
: asExpression (multiplicativeOperator asExpression)*
;
asExpression
(used by multiplicativeExpression)
: prefixUnaryExpression (asOperator type)?
;
prefixUnaryExpression
(used by asExpression, assignableExpression)
: unaryPrefix* postfixUnaryExpression
;
unaryPrefix
(used by prefixUnaryExpression)
: annotation
| label
| prefixUnaryOperator
;
postfixUnaryExpression
(used by prefixUnaryExpression, directlyAssignableExpression)
: primaryExpression
| primaryExpression postfixUnarySuffix+
;
postfixUnarySuffix
(used by postfixUnaryExpression)
: postfixUnaryOperator
| typeArguments
| callSuffix
| indexingSuffix
| navigationSuffix
;
directlyAssignableExpression
(used by assignment)
: postfixUnaryExpression assignableSuffix
| simpleIdentifier
;
assignableExpression
(used by assignment)
assignableSuffix
(used by directlyAssignableExpression)
: typeArguments
| indexingSuffix
| navigationSuffix
;
indexingSuffix
(used by postfixUnarySuffix, assignableSuffix)
: ‘[‘ expression (‘,’ expression)* ‘]‘
;
navigationSuffix
(used by postfixUnarySuffix, assignableSuffix)
: memberAccessOperator (simpleIdentifier | parenthesizedExpression | ‘class’)
;
callSuffix
(used by postfixUnarySuffix)
: typeArguments? valueArguments? annotatedLambda
| typeArguments? valueArguments
;
annotatedLambda
(used by callSuffix)
: annotation* label? lambdaLiteral
;
typeArguments
(used by simpleUserType, postfixUnarySuffix, assignableSuffix, callSuffix)
: ‘<’ typeProjection (‘,’ typeProjection)* ‘>’
;
valueArguments
(used by constructorInvocation, constructorDelegationCall, enumEntry, callSuffix)
: ‘(‘ ‘)’
| ‘(‘ valueArgument (‘,’ valueArgument)* ‘)’
;
valueArgument
(used by valueArguments)
: annotation? (simpleIdentifier ‘=’)? ‘*‘? expression
;
primaryExpression
(used by postfixUnaryExpression)
: parenthesizedExpression
| simpleIdentifier
| literalConstant
| stringLiteral
| callableReference
| functionLiteral
| objectLiteral
| collectionLiteral
| thisExpression
| superExpression
| ifExpression
| whenExpression
| tryExpression
| jumpExpression
;
parenthesizedExpression
(used by navigationSuffix, primaryExpression)
: ‘(‘ expression ‘)’
;
collectionLiteral
(used by primaryExpression)
: ‘[‘ expression (‘,’ expression)* ‘]‘
| ‘[‘ ‘]‘
;
literalConstant
(used by primaryExpression)
: BooleanLiteral
| IntegerLiteral
| HexLiteral
| BinLiteral
| CharacterLiteral
| RealLiteral
| ‘null’
| LongLiteral
| UnsignedLiteral
;
stringLiteral
(used by primaryExpression)
: lineStringLiteral
| multiLineStringLiteral
;
lineStringLiteral
(used by stringLiteral)
: ‘“‘ (lineStringContent | lineStringExpression)* ‘“‘
;
multiLineStringLiteral
(used by stringLiteral)
: ‘“””‘ (multiLineStringContent | multiLineStringExpression | ‘“‘)*
TRIPLE_QUOTE_CLOSE
;
lineStringContent
(used by lineStringLiteral)
: LineStrText
| LineStrEscapedChar
| LineStrRef
;
lineStringExpression
(used by lineStringLiteral)
: ‘${‘ expression ‘}’
;
multiLineStringContent
(used by multiLineStringLiteral)
: MultiLineStrText
| ‘“‘
| MultiLineStrRef
;
multiLineStringExpression
(used by multiLineStringLiteral)
: ‘${‘ expression ‘}’
;
lambdaLiteral
(used by annotatedLambda, functionLiteral)
: ‘{‘ statements ‘}’
| ‘{‘ lambdaParameters? ‘->’ statements ‘}’
;
lambdaParameters
(used by lambdaLiteral)
: lambdaParameter (‘,’ lambdaParameter)*
;
lambdaParameter
(used by lambdaParameters)
: variableDeclaration
| multiVariableDeclaration (‘:’ type)?
;
anonymousFunction
(used by functionLiteral)
: ‘fun’ (type ‘.’)? functionValueParameters
(‘:’ type)? typeConstraints?
functionBody?
;
functionLiteral
(used by primaryExpression)
: lambdaLiteral
| anonymousFunction
;
objectLiteral
(used by primaryExpression)
: ‘object’ ‘:’ delegationSpecifiers classBody
| ‘object’ classBody
;
thisExpression
(used by primaryExpression)
: ‘this’
| THIS_AT
;
superExpression
(used by primaryExpression)
: ‘super’ (‘<’ type ‘>’)? (‘@’ simpleIdentifier)?
| SUPER_AT
;
ifExpression
(used by primaryExpression)
: ‘if’ ‘(‘ expression ‘)’
(controlStructureBody | ‘;’)
| ‘if’ ‘(‘ expression ‘)’
controlStructureBody? ‘;’? ‘else’ (controlStructureBody | ‘;’)
;
whenSubject
(used by whenExpression)
: ‘(‘ (annotation* ‘val’ variableDeclaration ‘=’)? expression ‘)’
;
whenExpression
(used by primaryExpression)
: ‘when’ whenSubject? ‘{‘ whenEntry* ‘}’
;
whenEntry
(used by whenExpression)
: whenCondition (‘,’ whenCondition)* ‘->’ controlStructureBody semi?
| ‘else’ ‘->’ controlStructureBody semi?
;
whenCondition
(used by whenEntry)
: expression
| rangeTest
| typeTest
;
rangeTest
(used by whenCondition)
: inOperator expression
;
typeTest
(used by whenCondition)
: isOperator type
;
tryExpression
(used by primaryExpression)
: ‘try’ block ((catchBlock+ finallyBlock?) | finallyBlock)
;
catchBlock
(used by tryExpression)
: ‘catch’ ‘(‘ annotation* simpleIdentifier ‘:’ type ‘)’ block
;
finallyBlock
(used by tryExpression)
: ‘finally’ block
;
jumpExpression
(used by primaryExpression)
: ‘throw’ expression
| (‘return’ | RETURN_AT) expression?
| ‘continue’
| CONTINUE_AT
| ‘break’
| BREAK_AT
;
callableReference
(used by primaryExpression)
: (receiverType? ‘::’ (simpleIdentifier | ‘class’))
;
assignmentAndOperator
(used by assignment)
: ‘+=’
| ‘-=’
| ‘*=’
| ‘/=’
| ‘%=’
;
equalityOperator
(used by equality)
: ‘!=’
| ‘!==’
| ‘==’
| ‘===’
;
comparisonOperator
(used by comparison)
: ‘<’
| ‘>’
| ‘<=’
| ‘>=’
;
inOperator
(used by infixOperation, rangeTest)
: ‘in’
| NOT_IN
;
isOperator
(used by infixOperation, typeTest)
: ‘is’
| NOT_IS
;
additiveOperator
(used by additiveExpression)
: ‘+’
| ‘-‘
;
multiplicativeOperator
(used by multiplicativeExpression)
: ‘*‘
| ‘/‘
| ‘%’
;
asOperator
(used by asExpression)
: ‘as’
| ‘as?’
;
prefixUnaryOperator
(used by unaryPrefix)
: ‘++’
| ‘—‘
| ‘-‘
| ‘+’
| excl
;
postfixUnaryOperator
(used by postfixUnarySuffix)
: ‘++’
| ‘—‘
| ‘!’ excl
;
excl
(used by prefixUnaryOperator, postfixUnaryOperator)
: ‘!’
| EXCL_WS
;
memberAccessOperator
(used by navigationSuffix)
: ‘.’
| safeNav
| ‘::’
;
safeNav
(used by memberAccessOperator)
: ‘?’ ‘.’
;
Modifiers
modifiers
(used by typeAlias, classDeclaration, primaryConstructor, classParameter, companionObject, functionValueParameter, functionDeclaration, propertyDeclaration, getter, setter, objectDeclaration, secondaryConstructor, enumEntry)
: annotation
| modifier+
;
modifier
(used by modifiers)
: classModifier
| memberModifier
| visibilityModifier
| functionModifier
| propertyModifier
| inheritanceModifier
| parameterModifier
| platformModifier
;
typeModifiers
(used by type, receiverType)
: typeModifier+
;
typeModifier
(used by typeModifiers)
: annotation
| ‘suspend’
;
classModifier
(used by modifier)
: ‘enum’
| ‘sealed’
| ‘annotation’
| ‘data’
| ‘inner’
;
memberModifier
(used by modifier)
: ‘override’
| ‘lateinit’
;
visibilityModifier
(used by modifier)
: ‘public’
| ‘private’
| ‘internal’
| ‘protected’
;
varianceModifier
(used by typeProjectionModifier, typeParameterModifier)
: ‘in’
| ‘out’
;
typeParameterModifiers
(used by typeParameter)
typeParameterModifier
(used by typeParameterModifiers)
: reificationModifier
| varianceModifier
| annotation
;
functionModifier
(used by modifier)
: ‘tailrec’
| ‘operator’
| ‘infix’
| ‘inline’
| ‘external’
| ‘suspend’
;
propertyModifier
(used by modifier)
: ‘const’
;
inheritanceModifier
(used by modifier)
: ‘abstract’
| ‘final’
| ‘open’
;
parameterModifier
: ‘vararg’
| ‘noinline’
| ‘crossinline’
;
reificationModifier
(used by typeParameterModifier)
: ‘reified’
;
platformModifier
(used by modifier)
: ‘expect’
| ‘actual’
;
Annotations
annotation
(used by annotatedDelegationSpecifier, typeConstraint, variableDeclaration, setter, typeProjectionModifier, statement, forStatement, unaryPrefix, annotatedLambda, valueArgument, whenSubject, catchBlock, modifiers, typeModifier, typeParameterModifier)
: singleAnnotation
| multiAnnotation
;
singleAnnotation
(used by annotation)
: annotationUseSiteTarget unescapedAnnotation
| ‘@’ unescapedAnnotation
;
multiAnnotation
(used by annotation)
: annotationUseSiteTarget ‘[‘ unescapedAnnotation+ ‘]‘
| ‘@’ ‘[‘ unescapedAnnotation+ ‘]‘
;
annotationUseSiteTarget
(used by singleAnnotation, multiAnnotation)
: ANNOTATION_USE_SITE_TARGET_FIELD
| ANNOTATION_USE_SITE_TARGET_PROPERTY
| ANNOTATION_USE_SITE_TARGET_GET
| ANNOTATION_USE_SITE_TARGET_SET
| ANNOTATION_USE_SITE_TARGET_RECEIVER
| ANNOTATION_USE_SITE_TARGET_PARAM
| ANNOTATION_USE_SITE_TARGET_SETPARAM
| ANNOTATION_USE_SITE_TARGET_DELEGATE
;
unescapedAnnotation
(used by fileAnnotation, singleAnnotation, multiAnnotation)
: constructorInvocation
| userType
;
Identifiers
simpleIdentifier
(used by importAlias, typeAlias, classDeclaration, classParameter, typeParameter, typeConstraint, companionObject, functionDeclaration, variableDeclaration, setterParameter, parameter, objectDeclaration, enumEntry, simpleUserType, infixFunctionCall, directlyAssignableExpression, navigationSuffix, valueArgument, primaryExpression, superExpression, catchBlock, callableReference, identifier)
: Identifier
| ‘abstract’
| ‘annotation’
| ‘by’
| ‘catch’
| ‘companion’
| ‘constructor’
| ‘crossinline’
| ‘data’
| ‘dynamic’
| ‘enum’
| ‘external’
| ‘final’
| ‘finally’
| ‘get’
| ‘import’
| ‘infix’
| ‘init’
| ‘inline’
| ‘inner’
| ‘internal’
| ‘lateinit’
| ‘noinline’
| ‘open’
| ‘operator’
| ‘out’
| ‘override’
| ‘private’
| ‘protected’
| ‘public’
| ‘reified’
| ‘sealed’
| ‘tailrec’
| ‘set’
| ‘vararg’
| ‘where’
| ‘expect’
| ‘actual’
| ‘const’
| ‘suspend’
;
identifier
(used by packageHeader, importHeader)
: simpleIdentifier (‘.’ simpleIdentifier)*
;
Lexical grammar
General
ShebangLine
(used by shebangLine)
: ‘#!’ ~[\r\n]*
;
DelimitedComment
(used by DelimitedComment, Hidden)
: (‘/*‘ (DelimitedComment | .)*? ‘*/‘)
;
LineComment
(used by Hidden)
: (‘//‘ ~[\r\n]*)
;
WS
(used by Hidden)
: [\u0020\u0009\u000C]
;
helper
Hidden
(used by EXCL_WS, QUEST_WS, NOT_IS, NOT_IN)
: DelimitedComment
| LineComment
| WS
;
Separators and operations
RESERVED
: ‘…’
;
EXCL_WS
(used by excl)
: ‘!’ Hidden
;
DOUBLE_ARROW
: ‘=>’
;
DOUBLE_SEMICOLON
: ‘;;’
;
HASH
: ‘#’
;
QUEST_WS
(used by quest)
: ‘?’ Hidden
;
SINGLE_QUOTE
: ‘\‘’
;
Keywords
RETURN_AT
(used by jumpExpression)
: ‘[email protected]‘ Identifier
;
CONTINUE_AT
(used by jumpExpression)
: ‘[email protected]‘ Identifier
;
BREAK_AT
(used by jumpExpression)
: ‘[email protected]‘ Identifier
;
THIS_AT
(used by thisExpression)
: ‘[email protected]‘ Identifier
;
SUPER_AT
(used by superExpression)
: ‘[email protected]‘ Identifier
;
ANNOTATION_USE_SITE_TARGET_FILE
(used by fileAnnotation)
: ‘@file’ ‘:’
;
ANNOTATION_USE_SITE_TARGET_FIELD
(used by annotationUseSiteTarget)
: ‘@field’ ‘:’
;
ANNOTATION_USE_SITE_TARGET_PROPERTY
(used by annotationUseSiteTarget)
: ‘@property’ ‘:’
;
ANNOTATION_USE_SITE_TARGET_GET
(used by annotationUseSiteTarget)
: ‘@get’ ‘:’
;
ANNOTATION_USE_SITE_TARGET_SET
(used by annotationUseSiteTarget)
: ‘@set’ ‘:’
;
ANNOTATION_USE_SITE_TARGET_RECEIVER
(used by annotationUseSiteTarget)
: ‘@receiver’ ‘:’
;
ANNOTATION_USE_SITE_TARGET_PARAM
(used by annotationUseSiteTarget)
: ‘@param’ ‘:’
;
ANNOTATION_USE_SITE_TARGET_SETPARAM
(used by annotationUseSiteTarget)
: ‘@setparam’ ‘:’
;
ANNOTATION_USE_SITE_TARGET_DELEGATE
(used by annotationUseSiteTarget)
: ‘@delegate’ ‘:’
;
TYPEOF
: ‘typeof’
;
NOT_IS
(used by isOperator)
: ‘!is’ Hidden
;
NOT_IN
(used by inOperator)
: ‘!in’ Hidden
;
Literals
helper
DecDigit
(used by DecDigitOrSeparator, DecDigits, IntegerLiteral)
: ‘0’..’9’
;
helper
DecDigitNoZero
(used by IntegerLiteral)
: ‘1’..’9’
;
helper
DecDigitOrSeparator
(used by DecDigits, IntegerLiteral)
: DecDigit
| ‘_‘
;
helper
DecDigits
(used by DoubleExponent, FloatLiteral, DoubleLiteral)
: DecDigit DecDigitOrSeparator* DecDigit
| DecDigit
;
helper
DoubleExponent
(used by DoubleLiteral)
: [eE] [+-]? DecDigits
;
RealLiteral
(used by literalConstant)
: FloatLiteral
| DoubleLiteral
;
FloatLiteral
(used by RealLiteral)
: DoubleLiteral [fF]
| DecDigits [fF]
;
DoubleLiteral
(used by RealLiteral, FloatLiteral)
: DecDigits? ‘.’ DecDigits DoubleExponent?
| DecDigits DoubleExponent
;
IntegerLiteral
(used by literalConstant, UnsignedLiteral, LongLiteral)
: DecDigitNoZero DecDigitOrSeparator* DecDigit
| DecDigit
;
helper
HexDigit
(used by HexDigitOrSeparator, HexLiteral, UniCharacterLiteral)
: [0-9a-fA-F]
;
helper
HexDigitOrSeparator
(used by HexLiteral)
: HexDigit
| ‘_‘
;
HexLiteral
(used by literalConstant, UnsignedLiteral, LongLiteral)
: ‘0’ [xX] HexDigit HexDigitOrSeparator* HexDigit
| ‘0’ [xX] HexDigit
;
helper
BinDigit
(used by BinDigitOrSeparator, BinLiteral)
: [01]
;
helper
BinDigitOrSeparator
(used by BinLiteral)
: BinDigit
| ‘_‘
;
BinLiteral
(used by literalConstant, UnsignedLiteral, LongLiteral)
: ‘0’ [bB] BinDigit BinDigitOrSeparator* BinDigit
| ‘0’ [bB] BinDigit
;
UnsignedLiteral
(used by literalConstant)
: (IntegerLiteral | HexLiteral | BinLiteral) [uU] ‘L’?
;
LongLiteral
(used by literalConstant)
: (IntegerLiteral | HexLiteral | BinLiteral) ‘L’
;
BooleanLiteral
(used by literalConstant)
: ‘true’
| ‘false’
;
CharacterLiteral
(used by literalConstant)
: ‘\‘’ (EscapeSeq | ~[\n\r’\\]) ‘\‘’
;
Identifiers
helper
UnicodeDigit
(used by Identifier)
: UNICODE_CLASS_ND
;
Identifier
(used by simpleIdentifier, RETURN_AT, CONTINUE_AT, BREAK_AT, THIS_AT, SUPER_AT, IdentifierOrSoftKey)
: (Letter | ‘_‘) (Letter | ‘_‘ | UnicodeDigit)*
| ‘`‘ ~([\r\n] | ‘`‘ | ‘.’ | ‘;’ | ‘:’ | ‘\\‘ | ‘/‘ | ‘[‘ | ‘]‘ | ‘<’ | ‘>’)+ ‘`‘
;
Depending on the target and publicity of the declaration, the set of allowed symbols in identifiers is different. This rule contains the union of allowed symbols from all targets. Thus, the code for any target can be parsed using the grammar.
The allowed symbols in identifiers corresponding to the target and publicity of the declaration are given below.
Kotlin/JVM (any declaration publicity)
~ ( [\r\n] | ‘`‘ | ‘.’ | ‘;’ | ‘:’ | ‘\‘ | ‘/‘ | ‘[‘ | ‘]‘ | ‘<’ | ‘>’ )
Kotlin/Android (any declaration publicity)
The allowed symbols are different from allowed symbols for Kotlin/JVM and correspond to the Dalvik Executable format.
Kotlin/JS (private declarations)
~ ( [\r\n] | ‘`‘ )
Kotlin/JS (public declarations)
The allowed symbols for public declarations correspond to the ECMA specification (section 7.6) except that ECMA reserved words is allowed.
Kotlin/Native (any declaration publicity)
~ ( [\r\n] | ‘`‘ )
IdentifierOrSoftKey
(used by IdentifierAt, FieldIdentifier)
: Identifier
| ‘abstract’
| ‘annotation’
| ‘by’
| ‘catch’
| ‘companion’
| ‘constructor’
| ‘crossinline’
| ‘data’
| ‘dynamic’
| ‘enum’
| ‘external’
| ‘final’
| ‘finally’
| ‘get’
| ‘import’
| ‘infix’
| ‘init’
| ‘inline’
| ‘inner’
| ‘internal’
| ‘lateinit’
| ‘noinline’
| ‘open’
| ‘operator’
| ‘out’
| ‘override’
| ‘private’
| ‘protected’
| ‘public’
| ‘reified’
| ‘sealed’
| ‘tailrec’
| ‘set’
| ‘vararg’
| ‘where’
| ‘expect’
| ‘actual’
| ‘const’
| ‘suspend’
;
IdentifierAt
(used by label)
: IdentifierOrSoftKey ‘@’
;
FieldIdentifier
(used by LineStrRef, MultiLineStrRef)
: ‘$’ IdentifierOrSoftKey
;
helper
UniCharacterLiteral
(used by EscapeSeq, LineStrEscapedChar)
: ‘\\‘ ‘u’ HexDigit HexDigit HexDigit HexDigit
;
helper
EscapedIdentifier
(used by EscapeSeq, LineStrEscapedChar)
: ‘\\‘ (‘t’ | ‘b’ | ‘r’ | ‘n’ | ‘\‘’ | ‘“‘ | ‘\\‘ | ‘$’)
;
helper
EscapeSeq
(used by CharacterLiteral)
: UniCharacterLiteral
| EscapedIdentifier
;
Characters
helper
Letter
(used by Identifier)
: UNICODE_CLASS_LL
| UNICODE_CLASS_LM
| UNICODE_CLASS_LO
| UNICODE_CLASS_LT
| UNICODE_CLASS_LU
| UNICODE_CLASS_NL
;
Strings
LineStrRef
(used by lineStringContent)
: FieldIdentifier
;
See String templates
LineStrText
(used by lineStringContent)
: ~(‘\\‘ | ‘“‘ | ‘$’)+
| ‘$’
;
LineStrEscapedChar
(used by lineStringContent)
: EscapedIdentifier
| UniCharacterLiteral
;
TRIPLE_QUOTE_CLOSE
(used by multiLineStringLiteral)
: (‘“‘? ‘“””‘)
;
MultiLineStrRef
(used by multiLineStringContent)
: FieldIdentifier
;
MultiLineStrText
(used by multiLineStringContent)
: ~(‘“‘ | ‘$’)+
| ‘$’
;
ErrorCharacter
: .
;