Remove old grammar files
The new grammar is located in the Kotlin spec repo: https://github.com/JetBrains/kotlin-spec/tree/spec-rework/src/grammar
This commit is contained in:
@@ -1,3 +0,0 @@
|
||||
This module contains a semi-formal description of Kotlin grammar.
|
||||
It is processed by a [tool](https://github.com/JetBrains/kotlin-grammar-generator) to generate the Kotlin
|
||||
grammar specification on the [Kotlin Web site](http://kotlinlang.org/docs/reference/grammar.html).
|
||||
@@ -1,31 +0,0 @@
|
||||
/**
|
||||
## Annotations
|
||||
*/
|
||||
|
||||
annotations
|
||||
: (annotation | annotationList)*
|
||||
;
|
||||
|
||||
annotation
|
||||
: "@" (annotationUseSiteTarget ":")? unescapedAnnotation
|
||||
;
|
||||
|
||||
annotationList
|
||||
: "@" (annotationUseSiteTarget ":")? "[" unescapedAnnotation+ "]"
|
||||
;
|
||||
|
||||
annotationUseSiteTarget
|
||||
: "field"
|
||||
: "file"
|
||||
: "property"
|
||||
: "get"
|
||||
: "set"
|
||||
: "receiver"
|
||||
: "param"
|
||||
: "setparam"
|
||||
: "delegate"
|
||||
;
|
||||
|
||||
unescapedAnnotation
|
||||
: SimpleName{"."} typeArguments? valueArguments?
|
||||
;
|
||||
@@ -1,69 +0,0 @@
|
||||
/**
|
||||
## Classes
|
||||
|
||||
See [Classes and Inheritance](classes.html)
|
||||
*/
|
||||
|
||||
/*
|
||||
internal class Example<X, T : Comparable<X>>(protected val x : Foo<X, T>, y : Some)
|
||||
: Bar(x), Foo<X, T> by x, IAbstractSome by y.asAbstract()
|
||||
where
|
||||
T : Function<Object, Object>
|
||||
{
|
||||
// members
|
||||
}
|
||||
*/
|
||||
|
||||
class
|
||||
: modifiers ("class" | "interface") SimpleName
|
||||
typeParameters?
|
||||
primaryConstructor?
|
||||
(":" annotations delegationSpecifier{","})?
|
||||
typeConstraints
|
||||
(classBody? | enumClassBody)
|
||||
;
|
||||
|
||||
primaryConstructor
|
||||
: (modifiers "constructor")? ("(" functionParameter{","} ")")
|
||||
;
|
||||
|
||||
classBody
|
||||
: ("{" members "}")?
|
||||
;
|
||||
|
||||
members
|
||||
: memberDeclaration*
|
||||
;
|
||||
|
||||
delegationSpecifier
|
||||
: constructorInvocation // type and constructor arguments
|
||||
: userType
|
||||
: explicitDelegation
|
||||
;
|
||||
|
||||
explicitDelegation
|
||||
: userType "by" expression // internal this expression no foo {bar} is allowed
|
||||
;
|
||||
|
||||
typeParameters
|
||||
: "<" typeParameter{","} ">"
|
||||
;
|
||||
|
||||
typeParameter
|
||||
: modifiers SimpleName (":" userType)?
|
||||
;
|
||||
|
||||
/**
|
||||
See [Generic classes](generics.html)
|
||||
*/
|
||||
|
||||
typeConstraints
|
||||
: ("where" typeConstraint{","})?
|
||||
;
|
||||
|
||||
typeConstraint
|
||||
: annotations SimpleName ":" type
|
||||
;
|
||||
/**
|
||||
See [Generic constraints](generics.html#generic-constraints)
|
||||
*/
|
||||
@@ -1,124 +0,0 @@
|
||||
/**
|
||||
### Class members
|
||||
*/
|
||||
|
||||
/*
|
||||
class Example(a : Foo, i : Int) : Bar(i), Some {
|
||||
|
||||
// functions
|
||||
abstract fun foo(a : Bar)
|
||||
|
||||
fun foo(a : Bar) = 0
|
||||
|
||||
fun foo(a : Bar) = {
|
||||
return 0
|
||||
}
|
||||
|
||||
fun foo(a : Bar) { // return type is Unit
|
||||
|
||||
// properties
|
||||
val x : Int = 5
|
||||
var y : Double = 7.0d
|
||||
var z : String = "SDfsdf" {
|
||||
get() = $z + "sdfsd"
|
||||
private set(s : String) { $z = s }
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
memberDeclaration
|
||||
: companionObject
|
||||
: object
|
||||
: function
|
||||
: property
|
||||
: class
|
||||
: typeAlias
|
||||
: anonymousInitializer
|
||||
: secondaryConstructor
|
||||
;
|
||||
|
||||
anonymousInitializer
|
||||
: "init" block
|
||||
;
|
||||
|
||||
companionObject
|
||||
: modifiers "companion" "object" SimpleName? (":" delegationSpecifier{","})? classBody?
|
||||
;
|
||||
|
||||
valueParameters
|
||||
: "(" functionParameter{","}? ")"
|
||||
;
|
||||
|
||||
functionParameter
|
||||
: modifiers ("val" | "var")? parameter ("=" expression)?
|
||||
;
|
||||
|
||||
block
|
||||
: "{" statements "}"
|
||||
;
|
||||
|
||||
function
|
||||
: modifiers "fun"
|
||||
typeParameters?
|
||||
(type ".")?
|
||||
SimpleName
|
||||
typeParameters? valueParameters (":" type)?
|
||||
typeConstraints
|
||||
functionBody?
|
||||
;
|
||||
|
||||
functionBody
|
||||
: block
|
||||
: "=" expression
|
||||
;
|
||||
|
||||
variableDeclarationEntry
|
||||
: SimpleName (":" type)?
|
||||
;
|
||||
|
||||
multipleVariableDeclarations
|
||||
: "(" variableDeclarationEntry{","} ")"
|
||||
;
|
||||
|
||||
property
|
||||
: modifiers ("val" | "var")
|
||||
typeParameters?
|
||||
(type ".")?
|
||||
(multipleVariableDeclarations | variableDeclarationEntry)
|
||||
typeConstraints
|
||||
("by" | "=" expression SEMI?)?
|
||||
(getter? setter? | setter? getter?) SEMI?
|
||||
;
|
||||
/**
|
||||
See [Properties and Fields](properties.html)
|
||||
*/
|
||||
|
||||
getter
|
||||
: modifiers "get"
|
||||
: modifiers "get" "(" ")" (":" type)? functionBody
|
||||
;
|
||||
|
||||
setter
|
||||
: modifiers "set"
|
||||
: modifiers "set" "(" modifiers (SimpleName | parameter) ")" functionBody
|
||||
;
|
||||
|
||||
parameter
|
||||
: SimpleName ":" type
|
||||
;
|
||||
|
||||
object
|
||||
: modifiers "object" SimpleName primaryConstructor? (":" delegationSpecifier{","})? classBody?
|
||||
;
|
||||
|
||||
secondaryConstructor
|
||||
: modifiers "constructor" valueParameters (":" constructorDelegationCall)? block
|
||||
;
|
||||
|
||||
constructorDelegationCall
|
||||
: "this" valueArguments
|
||||
: "super" valueArguments
|
||||
;
|
||||
/**
|
||||
See [Object expressions and Declarations](object-declarations.html)
|
||||
*/
|
||||
@@ -1,44 +0,0 @@
|
||||
/**
|
||||
## Control structures
|
||||
|
||||
See [Control structures](control-flow.html)
|
||||
*/
|
||||
|
||||
controlStructureBody
|
||||
: block
|
||||
: blockLevelExpression
|
||||
;
|
||||
|
||||
if
|
||||
: "if" "(" expression ")" controlStructureBody SEMI? ("else" controlStructureBody)?
|
||||
;
|
||||
|
||||
try
|
||||
: "try" block catchBlock* finallyBlock?
|
||||
;
|
||||
|
||||
catchBlock
|
||||
: "catch" "(" annotations SimpleName ":" userType ")" block
|
||||
;
|
||||
|
||||
finallyBlock
|
||||
: "finally" block
|
||||
;
|
||||
|
||||
loop
|
||||
: for
|
||||
: while
|
||||
: doWhile
|
||||
;
|
||||
|
||||
for
|
||||
: "for" "(" annotations (multipleVariableDeclarations | variableDeclarationEntry) "in" expression ")" controlStructureBody
|
||||
;
|
||||
|
||||
while
|
||||
: "while" "(" expression ")" controlStructureBody
|
||||
;
|
||||
|
||||
doWhile
|
||||
: "do" controlStructureBody "while" "(" expression ")"
|
||||
;
|
||||
@@ -1,17 +0,0 @@
|
||||
/**
|
||||
### Enum classes
|
||||
|
||||
See [Enum classes](enum-classes.html)
|
||||
*/
|
||||
|
||||
enumClassBody
|
||||
: "{" enumEntries (";" members)? "}"
|
||||
;
|
||||
|
||||
enumEntries
|
||||
: (enumEntry{","} ","? ";"?)?
|
||||
;
|
||||
|
||||
enumEntry
|
||||
: modifiers SimpleName valueArguments? classBody?
|
||||
;
|
||||
@@ -1,282 +0,0 @@
|
||||
/**
|
||||
## Expressions
|
||||
|
||||
<!--See [Expressions](expressions.html)-->
|
||||
|
||||
### Precedence
|
||||
|
||||
| Precedence | Title | Symbols |
|
||||
|------------|-------|---------|
|
||||
| Highest | Postfix | `++`, `--`, `.`, `?.`, `?` |
|
||||
| | Prefix | `-`, `+`, `++`, `--`, `!`, [`labelDefinition`](#labelDefinition) |
|
||||
| | Type RHS | `:`, `as`, `as?` |
|
||||
| | Multiplicative | `*`, `/`, `%` |
|
||||
| | Additive | `+`, `-` |
|
||||
| | Range | `..` |
|
||||
| | Infix function | [`SimpleName`](#SimpleName) |
|
||||
| | Elvis | `?:` |
|
||||
| | Named checks | `in`, `!in`, `is`, `!is` |
|
||||
| | Comparison | `<`, `>`, `<=`, `>=` |
|
||||
| | Equality | `==`, `!==` |
|
||||
| | Conjunction | `&&` |
|
||||
| | Disjunction | `||` |
|
||||
| Lowest | Assignment | `=`, `+=`, `-=`, `*=`, `/=`, `%=` |
|
||||
|
||||
### Rules
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
Decreasing precedence:
|
||||
memberAccessOperation
|
||||
postfixUnaryOperation
|
||||
prefixUnaryOperation
|
||||
multiplicativeOperation
|
||||
additiveOperation
|
||||
".."
|
||||
SimpleName
|
||||
"?:"
|
||||
namedInfixOrTypeOperation
|
||||
comparisonOperation
|
||||
equalityOperation
|
||||
"&&"
|
||||
"||"
|
||||
assignmentOperator
|
||||
*/
|
||||
|
||||
expression
|
||||
: disjunction (assignmentOperator disjunction)*
|
||||
;
|
||||
|
||||
disjunction
|
||||
: conjunction ("||" conjunction)*
|
||||
;
|
||||
|
||||
conjunction
|
||||
: equalityComparison ("&&" equalityComparison)*
|
||||
;
|
||||
|
||||
equalityComparison
|
||||
: comparison (equalityOperation comparison)*
|
||||
;
|
||||
|
||||
comparison
|
||||
: namedInfix (comparisonOperation namedInfix)*
|
||||
;
|
||||
|
||||
namedInfix
|
||||
: elvisExpression (inOperation elvisExpression)*
|
||||
: elvisExpression (isOperation type)?
|
||||
;
|
||||
|
||||
elvisExpression
|
||||
: infixFunctionCall ("?:" infixFunctionCall)*
|
||||
;
|
||||
|
||||
infixFunctionCall
|
||||
: rangeExpression (SimpleName rangeExpression)*
|
||||
;
|
||||
|
||||
rangeExpression
|
||||
: additiveExpression (".." additiveExpression)*
|
||||
;
|
||||
|
||||
additiveExpression
|
||||
: multiplicativeExpression (additiveOperation multiplicativeExpression)*
|
||||
;
|
||||
|
||||
multiplicativeExpression
|
||||
: typeRHS (multiplicativeOperation typeRHS)*
|
||||
;
|
||||
|
||||
typeRHS
|
||||
: prefixUnaryExpression (typeOperation prefixUnaryExpression)*
|
||||
;
|
||||
|
||||
prefixUnaryExpression
|
||||
: prefixUnaryOperation* postfixUnaryExpression
|
||||
;
|
||||
|
||||
postfixUnaryExpression
|
||||
: atomicExpression postfixUnaryOperation*
|
||||
: callableReference postfixUnaryOperation*
|
||||
;
|
||||
|
||||
// TODO: update this rule to include class literals and bound callable references
|
||||
callableReference
|
||||
: (userType "?"*)? "::" SimpleName typeArguments?
|
||||
;
|
||||
|
||||
// !!! When you add here, remember to update the FIRST set in the parser
|
||||
atomicExpression
|
||||
: "(" expression ")"
|
||||
: literalConstant
|
||||
: functionLiteral
|
||||
: "this" labelReference?
|
||||
: "super" ("<" type ">")? labelReference?
|
||||
: if
|
||||
: when
|
||||
: try
|
||||
: objectLiteral
|
||||
: jump
|
||||
: loop
|
||||
: collectionLiteral
|
||||
: SimpleName
|
||||
;
|
||||
|
||||
labelReference
|
||||
: "@" ++ LabelName
|
||||
;
|
||||
|
||||
labelDefinition
|
||||
: LabelName ++ "@"
|
||||
;
|
||||
|
||||
literalConstant
|
||||
: "true" | "false"
|
||||
: stringTemplate
|
||||
: NoEscapeString
|
||||
: IntegerLiteral
|
||||
: CharacterLiteral
|
||||
: FloatLiteral
|
||||
: "null"
|
||||
;
|
||||
|
||||
stringTemplate
|
||||
: "\"" stringTemplateElement* "\""
|
||||
;
|
||||
|
||||
stringTemplateElement
|
||||
: RegularStringPart
|
||||
: ShortTemplateEntryStart (SimpleName | "this")
|
||||
: EscapeSequence
|
||||
: longTemplate
|
||||
;
|
||||
|
||||
longTemplate
|
||||
: "${" expression "}"
|
||||
;
|
||||
|
||||
declaration
|
||||
: function
|
||||
: property
|
||||
: class
|
||||
: typeAlias
|
||||
: object
|
||||
;
|
||||
|
||||
statement
|
||||
: declaration
|
||||
: blockLevelExpression
|
||||
;
|
||||
|
||||
blockLevelExpression
|
||||
: annotations ("\n")+ expression
|
||||
;
|
||||
|
||||
multiplicativeOperation
|
||||
: "*" : "/" : "%"
|
||||
;
|
||||
|
||||
additiveOperation
|
||||
: "+" : "-"
|
||||
;
|
||||
|
||||
inOperation
|
||||
: "in" : "!in"
|
||||
;
|
||||
|
||||
typeOperation
|
||||
: "as" : "as?" : ":"
|
||||
;
|
||||
|
||||
isOperation
|
||||
: "is" : "!is"
|
||||
;
|
||||
|
||||
comparisonOperation
|
||||
: "<" : ">" : ">=" : "<="
|
||||
;
|
||||
|
||||
equalityOperation
|
||||
: "!=" : "=="
|
||||
;
|
||||
|
||||
assignmentOperator
|
||||
: "="
|
||||
: "+=" : "-=" : "*=" : "/=" : "%="
|
||||
;
|
||||
|
||||
prefixUnaryOperation
|
||||
: "-" : "+"
|
||||
: "++" : "--"
|
||||
: "!"
|
||||
: annotations
|
||||
: labelDefinition
|
||||
;
|
||||
|
||||
postfixUnaryOperation
|
||||
: "++" : "--" : "!!"
|
||||
: callSuffix
|
||||
: arrayAccess
|
||||
: memberAccessOperation postfixUnaryExpression // TODO: Review
|
||||
;
|
||||
|
||||
callSuffix
|
||||
: typeArguments? valueArguments annotatedLambda
|
||||
: typeArguments annotatedLambda
|
||||
;
|
||||
|
||||
annotatedLambda
|
||||
: ("@" unescapedAnnotation)* labelDefinition? functionLiteral
|
||||
;
|
||||
|
||||
memberAccessOperation
|
||||
: "." : "?." : "?"
|
||||
;
|
||||
|
||||
typeArguments
|
||||
: "<" type{","} ">"
|
||||
;
|
||||
|
||||
valueArguments
|
||||
: "(" ((SimpleName "=")? "*"? expression){","} ")"
|
||||
;
|
||||
|
||||
jump
|
||||
: "throw" expression
|
||||
: "return" ++ labelReference? expression?
|
||||
: "continue" ++ labelReference?
|
||||
: "break" ++ labelReference?
|
||||
// yield ?
|
||||
;
|
||||
|
||||
functionLiteral
|
||||
: "{" statements "}"
|
||||
: "{" lambdaParameter{","} "->" statements "}"
|
||||
;
|
||||
|
||||
lambdaParameter
|
||||
: variableDeclarationEntry
|
||||
: multipleVariableDeclarations (":" type)?
|
||||
;
|
||||
|
||||
statements
|
||||
: SEMI* statement{SEMI+} SEMI*
|
||||
;
|
||||
|
||||
constructorInvocation
|
||||
: userType callSuffix
|
||||
;
|
||||
|
||||
arrayAccess
|
||||
: "[" expression{","} "]"
|
||||
;
|
||||
|
||||
objectLiteral
|
||||
: "object" (":" delegationSpecifier{","})? classBody
|
||||
;
|
||||
|
||||
collectionLiteral
|
||||
: "[" expression{","}? "]"
|
||||
;
|
||||
@@ -1,174 +0,0 @@
|
||||
/**
|
||||
# Lexical structure
|
||||
*/
|
||||
|
||||
[helper]
|
||||
LongSuffix
|
||||
: "L"
|
||||
;
|
||||
|
||||
IntegerLiteral
|
||||
: DecimalLiteral LongSuffix?
|
||||
: HexadecimalLiteral LongSuffix?
|
||||
: BinaryLiteral LongSuffix?
|
||||
;
|
||||
|
||||
[helper]
|
||||
Digit
|
||||
: ["0".."9"]
|
||||
;
|
||||
|
||||
DecimalLiteral
|
||||
: Digit
|
||||
: Digit (Digit | "_")* Digit
|
||||
;
|
||||
|
||||
FloatLiteral
|
||||
: <Java double literal>
|
||||
;
|
||||
|
||||
[helper]
|
||||
HexDigit
|
||||
: Digit | ["A".."F", "a".."f"]
|
||||
;
|
||||
|
||||
HexadecimalLiteral
|
||||
: "0" ("x" | "X") HexDigit
|
||||
: "0" ("x" | "X") HexDigit (HexDigit | "_")* HexDigit
|
||||
;
|
||||
|
||||
[helper]
|
||||
BinaryDigit
|
||||
: ("0" | "1")
|
||||
;
|
||||
|
||||
BinaryLiteral
|
||||
: "0" ("b" | "B") BinaryDigit
|
||||
: "0" ("b" | "B") BinaryDigit (BinaryDigit | "_")* BinaryDigit
|
||||
|
||||
CharacterLiteral
|
||||
: <character as in Java>
|
||||
;
|
||||
|
||||
/**
|
||||
See [Basic types](basic-types.html)
|
||||
*/
|
||||
|
||||
NoEscapeString
|
||||
: <"""-quoted string>
|
||||
;
|
||||
|
||||
RegularStringPart
|
||||
: <any character other than backslash, quote, $ or newline>
|
||||
;
|
||||
|
||||
ShortTemplateEntryStart
|
||||
: "$"
|
||||
;
|
||||
|
||||
EscapeSequence
|
||||
: UnicodeEscapeSequence | RegularEscapeSequence
|
||||
;
|
||||
|
||||
UnicodeEscapeSequence
|
||||
: "\u" HexDigit{4}
|
||||
;
|
||||
|
||||
RegularEscapeSequence
|
||||
: "\" <any character other than newline>
|
||||
;
|
||||
|
||||
/**
|
||||
See [String templates](basic-types.html#string-templates)
|
||||
*/
|
||||
|
||||
SEMI
|
||||
: <semicolon or newline>
|
||||
;
|
||||
|
||||
SimpleName
|
||||
: <java identifier>
|
||||
: "`" <java identifier> "`"
|
||||
;
|
||||
|
||||
/**
|
||||
See [Java interoperability](java-interop.html)
|
||||
*/
|
||||
|
||||
LabelName
|
||||
: SimpleName
|
||||
;
|
||||
|
||||
/**
|
||||
See [Returns and jumps](returns.html)
|
||||
*/
|
||||
|
||||
/* Symbols:
|
||||
|
||||
[](){}<>
|
||||
,
|
||||
.
|
||||
:
|
||||
<= >= == != === !==
|
||||
+ - * / %
|
||||
=
|
||||
+= -= *= /= %=
|
||||
++ -- !
|
||||
&& || -- may be just & and |
|
||||
=>
|
||||
..
|
||||
?
|
||||
?:
|
||||
?.
|
||||
*/
|
||||
|
||||
/* Keywords:
|
||||
package
|
||||
as
|
||||
type
|
||||
class
|
||||
this
|
||||
val
|
||||
var
|
||||
fun
|
||||
extension
|
||||
for
|
||||
null
|
||||
typeof
|
||||
new
|
||||
true
|
||||
false
|
||||
is
|
||||
in
|
||||
throw
|
||||
return
|
||||
break
|
||||
continue
|
||||
object
|
||||
if
|
||||
else
|
||||
while
|
||||
do
|
||||
when
|
||||
out
|
||||
ref
|
||||
try
|
||||
|
||||
Soft:
|
||||
where -- in class, function and type headers
|
||||
by -- in a class header (Delegation specifier)
|
||||
get, set -- in a property definition
|
||||
import
|
||||
final
|
||||
abstract
|
||||
enum
|
||||
open
|
||||
annotation
|
||||
override
|
||||
private
|
||||
public
|
||||
internal
|
||||
protected
|
||||
catch
|
||||
finally
|
||||
*/
|
||||
@@ -1,85 +0,0 @@
|
||||
/**
|
||||
## Modifiers
|
||||
*/
|
||||
|
||||
modifiers
|
||||
: (modifier | annotations)*
|
||||
;
|
||||
|
||||
typeModifiers
|
||||
: (suspendModifier | annotations)*
|
||||
;
|
||||
|
||||
modifier
|
||||
: classModifier
|
||||
: accessModifier
|
||||
: varianceAnnotation
|
||||
: memberModifier
|
||||
: parameterModifier
|
||||
: typeParameterModifier
|
||||
: functionModifier
|
||||
: propertyModifier
|
||||
: multiPlatformModifier
|
||||
;
|
||||
|
||||
classModifier
|
||||
: "abstract"
|
||||
: "final"
|
||||
: "enum"
|
||||
: "open"
|
||||
: "annotation"
|
||||
: "sealed"
|
||||
: "data"
|
||||
;
|
||||
|
||||
memberModifier
|
||||
: "override"
|
||||
: "open"
|
||||
: "final"
|
||||
: "abstract"
|
||||
: "lateinit"
|
||||
;
|
||||
|
||||
accessModifier
|
||||
: "private"
|
||||
: "protected"
|
||||
: "public"
|
||||
: "internal"
|
||||
;
|
||||
|
||||
varianceAnnotation
|
||||
: "in"
|
||||
: "out"
|
||||
;
|
||||
|
||||
parameterModifier
|
||||
: "noinline"
|
||||
: "crossinline"
|
||||
: "vararg"
|
||||
;
|
||||
|
||||
typeParameterModifier
|
||||
: "reified"
|
||||
;
|
||||
|
||||
functionModifier
|
||||
: "tailrec"
|
||||
: "operator"
|
||||
: "infix"
|
||||
: "inline"
|
||||
: "external"
|
||||
: suspendModifier
|
||||
;
|
||||
|
||||
propertyModifier
|
||||
: "const"
|
||||
;
|
||||
|
||||
suspendModifier
|
||||
: "suspend"
|
||||
;
|
||||
|
||||
multiPlatformModifier
|
||||
: "expect"
|
||||
: "actual"
|
||||
;
|
||||
@@ -1,29 +0,0 @@
|
||||
/**
|
||||
# Notation
|
||||
|
||||
This section informally explains the grammar notation used below.
|
||||
|
||||
## Symbols and naming
|
||||
|
||||
_Terminal symbol_ names start with an uppercase letter, e.g. **SimpleName**.<br>
|
||||
_Nonterminal symbol_ names start with a lowercase letter, e.g. **kotlinFile**.<br>
|
||||
Each _production_ starts with a colon (**:**).<br>
|
||||
_Symbol definitions_ may have many productions and are terminated by a semicolon (**;**).<br>
|
||||
Symbol definitions may be prepended with _attributes_, e.g. `start` attribute denotes a start symbol.
|
||||
|
||||
## EBNF expressions
|
||||
|
||||
Operator `|` denotes _alternative_.<br>
|
||||
Operator `*` denotes _iteration_ (zero or more).<br>
|
||||
Operator `+` denotes _iteration_ (one or more).<br>
|
||||
Operator `?` denotes _option_ (zero or one).<br>
|
||||
alpha`{`beta`}` denotes a nonempty _beta_-separated list of _alpha_'s. <br>
|
||||
Operator `++` means that no space or comment is allowed between operands.
|
||||
|
||||
# Semicolons
|
||||
|
||||
Kotlin provides "semicolon inference": syntactically, subsentences (e.g., statements, declarations etc) are separated by
|
||||
the pseudo-token [SEMI](#SEMI), which stands for "semicolon or newline". In most cases, there's no need for semicolons in
|
||||
Kotlin code.
|
||||
|
||||
*/
|
||||
@@ -1,55 +0,0 @@
|
||||
/**
|
||||
# Syntax
|
||||
|
||||
Relevant pages: [Packages](packages.html)
|
||||
*/
|
||||
|
||||
[start]
|
||||
kotlinFile
|
||||
: preamble topLevelObject*
|
||||
;
|
||||
|
||||
[start]
|
||||
script
|
||||
: preamble expression*
|
||||
;
|
||||
|
||||
preamble
|
||||
: fileAnnotations? packageHeader? import*
|
||||
;
|
||||
|
||||
fileAnnotations
|
||||
: fileAnnotation*
|
||||
;
|
||||
|
||||
fileAnnotation
|
||||
: "@" "file" ":" ("[" unescapedAnnotation+ "]" | unescapedAnnotation)
|
||||
;
|
||||
|
||||
packageHeader
|
||||
: modifiers "package" SimpleName{"."} SEMI?
|
||||
;
|
||||
|
||||
/**
|
||||
See [Packages](packages.html)
|
||||
*/
|
||||
|
||||
import
|
||||
: "import" SimpleName{"."} ("." "*" | "as" SimpleName)? SEMI?
|
||||
;
|
||||
|
||||
/**
|
||||
See [Imports](packages.html#imports)
|
||||
*/
|
||||
|
||||
topLevelObject
|
||||
: class
|
||||
: object
|
||||
: function
|
||||
: property
|
||||
: typeAlias
|
||||
;
|
||||
|
||||
typeAlias
|
||||
: modifiers "typealias" SimpleName typeParameters? "=" type
|
||||
;
|
||||
@@ -1,46 +0,0 @@
|
||||
/**
|
||||
## Types
|
||||
|
||||
See [Types](basic-types.html)
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
Foo<Bar<X>, T, Object> // user type
|
||||
(A, Object) -> Foo // function type
|
||||
() -> Foo // function with no arguments
|
||||
|
||||
*/
|
||||
|
||||
type
|
||||
: typeModifiers typeReference
|
||||
;
|
||||
|
||||
// If you change this, consider updating TYPE_REF_FIRST in KotlinParsing
|
||||
typeReference
|
||||
: "(" typeReference ")"
|
||||
: functionType
|
||||
: userType
|
||||
: nullableType
|
||||
: "dynamic"
|
||||
;
|
||||
|
||||
nullableType
|
||||
: typeReference "?"
|
||||
;
|
||||
|
||||
userType
|
||||
: simpleUserType{"."}
|
||||
;
|
||||
|
||||
simpleUserType
|
||||
: SimpleName ("<" (projection? type | "*"){","} ">")?
|
||||
;
|
||||
|
||||
projection
|
||||
: varianceAnnotation
|
||||
;
|
||||
|
||||
functionType
|
||||
: (type ".")? "(" parameter{","}? ")" "->" type
|
||||
;
|
||||
@@ -1,22 +0,0 @@
|
||||
/**
|
||||
#### When-expression
|
||||
|
||||
See [When-expression](control-flow.html#when-expression)
|
||||
*/
|
||||
|
||||
when
|
||||
: "when" ("(" expression ")")? "{"
|
||||
whenEntry*
|
||||
"}"
|
||||
;
|
||||
|
||||
whenEntry
|
||||
: whenCondition{","} "->" controlStructureBody SEMI
|
||||
: "else" "->" controlStructureBody SEMI
|
||||
;
|
||||
|
||||
whenCondition
|
||||
: expression
|
||||
: ("in" | "!in") expression
|
||||
: ("is" | "!is") type
|
||||
;
|
||||
Reference in New Issue
Block a user