1file <- shebangLine? NL* fileAnnotation* _* packageHeader* _* importList* _* (filePart / _ / unparsable)* EOF
2filePart <- (topLevelObject / (statement _* semi))
3unparsable <- [^\n]+ NL* { printf("Syntax error at byte %d\n", $0s);}
4
5### Converted from peg/kotlin/KotlinParser.g4
6
7# options
8# // SECTION: general
9#kotlinFile <- shebangLine? NL* fileAnnotation* _* packageHeader _* importList _* topLevelObject* EOF
10#script <- shebangLine? NL* fileAnnotation* _* packageHeader _* importList _* (statement _* semi)* EOF
11shebangLine <- ShebangLine _* NL+
12fileAnnotation <- (AT_NO_WS / AT_PRE_WS) FILE NL* COLON _* NL* (LSQUARE _* unescapedAnnotation+ _* RSQUARE / unescapedAnnotation) _* NL*
13packageHeader <- PACKAGE _ <identifier> {printf("%s", $1);} _* semi?
14importList <- importHeader+
15importHeader <- IMPORT _ identifier (DOT MULT / importAlias)? _* semi? _*
16importAlias <- _ AS _ simpleIdentifier
17topLevelObject <- declaration _* semis?
18typeAlias <- modifiers? _* TYPE_ALIAS (_ / NL)* <simpleIdentifier> {printf("%s\n", $1);} _* (__* typeParameters)? __* ASSIGNMENT __* type
19declaration <- classDeclaration / objectDeclaration / functionDeclaration / propertyDeclaration / typeAlias
20
21# // SECTION: classes
22classDeclaration <- modifiers? (CLASS / (FUN __*)? INTERFACE) _ NL* <simpleIdentifier> {printf("%s\n", $1);} (__* typeParameters)? (__* primaryConstructor)? (__* COLON __* delegationSpecifiers)? (__* typeConstraints)? (__* classBody / __* enumClassBody)?
23primaryConstructor <- (modifiers? CONSTRUCTOR __*)? classParameters
24classBody <- LCURL __* classMemberDeclarations __* RCURL
25classParameters <- LPAREN __* (classParameter (__* COMMA __* classParameter)* (__* COMMA)?)? __* RPAREN
26classParameter <- (modifiers? _* VAL / modifiers? _* VAR / modifiers? _*)? __* <simpleIdentifier> {printf("%s\n", $1);} _* COLON __* type (__* ASSIGNMENT __* expression)?
27delegationSpecifiers <- annotatedDelegationSpecifier (__* COMMA __* annotatedDelegationSpecifier)*
28delegationSpecifier <- constructorInvocation / explicitDelegation / userType / functionType
29constructorInvocation <- userType _* valueArguments
30annotatedDelegationSpecifier <- annotation* __* delegationSpecifier
31explicitDelegation <- (userType / functionType) __* BY __* expression
32typeParameters <- LANGLE __* typeParameter (__* COMMA __* typeParameter)* (__* COMMA)? __* RANGLE
33typeParameter <- typeParameterModifiers? __* simpleIdentifier (__* COLON __* type)?
34typeConstraints <- WHERE __* typeConstraint (__* COMMA __* typeConstraint)*
35typeConstraint <- annotation* simpleIdentifier __* COLON __* type
36
37# // SECTION: classMembers
38classMemberDeclarations <- (classMemberDeclaration semis?)*
39classMemberDeclaration <- secondaryConstructor / anonymousInitializer / companionObject / declaration
40anonymousInitializer <- INIT __* block
41companionObject <- modifiers? COMPANION __* OBJECT <(__* simpleIdentifier)?> {printf("%s\n", $1e-$1s != 0 ? $1 : "Companion");} (__* COLON __* delegationSpecifiers)? (__* classBody)?
42functionValueParameters <- LPAREN __* (functionValueParameter (__* COMMA __* functionValueParameter)* (__* COMMA)?)? __* RPAREN
43functionValueParameter <- parameterModifiers? _* parameter (__* ASSIGNMENT __* expression)?
44functionDeclaration <- modifiers? _* FUN _* (__* typeParameters)? _* (__* receiverTypeAndDot)? __* <simpleIdentifier> {printf("%s\n", $1);} __* functionValueParameters _* (__* COLON __* type)? _* (__* typeConstraints)? _* (__* functionBody)?
45functionBody <- block / ASSIGNMENT __* expression
46variableDeclaration <- annotation* __* <simpleIdentifier> {printf("%s\n", $1);} (__* COLON __* type)?
47multiVariableDeclaration <- LPAREN __* variableDeclaration _* (__* COMMA __* variableDeclaration)* _* (__* COMMA)? __* RPAREN
48propertyDeclaration <- modifiers? _* (VAL / VAR) _ (__* typeParameters)? (__* receiverTypeAndDot)? (__* (multiVariableDeclaration / variableDeclaration)) (__* typeConstraints)? (__* (ASSIGNMENT __* expression / propertyDelegate))? (semi? _* setter (NL* semi? _* getter)? / semi? _* getter (NL* semi? _* setter)?)?
49propertyDelegate <- BY __* expression
50# TODO: better handling of empty getters and setters?
51getter <- (modifiers _*)? GET __* LPAREN __* RPAREN (__* COLON __* type)? __* functionBody / (modifiers _*)? GET !(_* [^;\r\n])
52setter <- (modifiers _*)? SET __* LPAREN __* parameterWithOptionalType (__* COMMA)? __* RPAREN (__* COLON __* type)? __* functionBody / (modifiers _*)? SET !(_* [^;\r\n])
53parametersWithOptionalType <- LPAREN __* (parameterWithOptionalType (__* COMMA __* parameterWithOptionalType)* (__* COMMA)?)? __* RPAREN
54parameterWithOptionalType <- parameterModifiers? simpleIdentifier __* (COLON __* type)?
55parameter <- simpleIdentifier __* COLON __* type
56objectDeclaration <- modifiers? _* OBJECT __* <simpleIdentifier> {printf("%s\n", $1);} (__* COLON __* delegationSpecifiers)? (__* classBody)?
57secondaryConstructor <- modifiers? CONSTRUCTOR __* functionValueParameters (__* COLON __* constructorDelegationCall)? __* block?
58constructorDelegationCall <- THIS __* valueArguments / SUPER __* valueArguments
59
60# // SECTION: enumClasses
61enumClassBody <- LCURL __* enumEntries? (__* SEMICOLON __* classMemberDeclarations)? __* RCURL
62enumEntries <- enumEntry (__* COMMA __* enumEntry)* __* COMMA?
63enumEntry <- (modifiers __*)? simpleIdentifier (__* valueArguments)? (__* classBody)?
64
65# // SECTION: types
66type <- typeModifiers? ( functionType / nullableType / parenthesizedType / typeReference)
67typeReference <- userType / DYNAMIC
68nullableType <- (typeReference / parenthesizedType) __* quest+
69quest <- !elvis (QUEST_WS / QUEST_NO_WS)
70userType <- simpleUserType (__* DOT __* simpleUserType)*
71simpleUserType <- simpleIdentifier (__* typeArguments)?
72typeProjection <- typeProjectionModifiers? type / MULT
73typeProjectionModifiers <- typeProjectionModifier+
74typeProjectionModifier <- varianceModifier __* / annotation
75functionType <- (receiverType __* DOT __*)? functionTypeParameters __* ARROW __* type
76functionTypeParameters <- LPAREN __* (parameter / type)? _* (__* COMMA __* (parameter / type))* _* (__* COMMA)? __* RPAREN
77parenthesizedType <- LPAREN __* type __* RPAREN
78receiverType <- (typeModifiers _*)? (nullableType / parenthesizedType / typeReference)
79# parenthesizedUserType <- LPAREN __* userType __* RPAREN / LPAREN __* parenthesizedUserType __* RPAREN
80receiverTypeAndDot <- (typeModifiers _*)? (nullableType __* DOT __* / parenthesizedType __* DOT __* / (simpleUserType __* DOT __*)+)
81
82# // SECTION: statements
83#statements <- (statement (semis statement)*)? semis?
84statements <- (statement _* (semis _* statement _*)*)? _* semis?
85statement <- (label / annotation)* ( declaration / assignment / loopStatement / expression)
86label <- simpleIdentifier (AT_POST_WS / AT_NO_WS) __*
87controlStructureBody <- block / statement
88block <- LCURL __* statements __* RCURL
89loopStatement <- forStatement / whileStatement / doWhileStatement
90forStatement <- FOR __* LPAREN _* annotation* _* (variableDeclaration / multiVariableDeclaration) _ IN _ inside_expression _* RPAREN __* (controlStructureBody)?
91whileStatement <- WHILE __* LPAREN _* inside_expression _* RPAREN __* controlStructureBody / WHILE __* LPAREN _* expression _* RPAREN __* SEMICOLON
92doWhileStatement <- DO __* controlStructureBody? __* WHILE __* LPAREN _* expression _* RPAREN
93assignment <- directlyAssignableExpression _* ASSIGNMENT __* expression / assignableExpression _* assignmentAndOperator __* expression
94semi <- (_* (SEMICOLON / NL) _*) NL*
95semis <- (_* (SEMICOLON / NL) _*)+
96
97# // SECTION: expressions
98expression <- disjunction
99disjunction <- conjunction (__* DISJ __* conjunction)*
100conjunction <- equality (__* CONJ __* equality)*
101equality <- comparison (_* equalityOperator __* comparison _*)*
102comparison <- genericCallLikeComparison (_* comparisonOperator __* genericCallLikeComparison _*)*
103genericCallLikeComparison <- infixOperation (_* callSuffix)*
104infixOperation <- elvisExpression (_* inOperator __* elvisExpression / _* isOperator __* type)*
105elvisExpression <- infixFunctionCall (__* elvis __* infixFunctionCall)*
106elvis <- QUEST_NO_WS COLON
107infixFunctionCall <- rangeExpression (_* simpleIdentifier __* rangeExpression)*
108rangeExpression <- additiveExpression (_* RANGE __* additiveExpression)*
109additiveExpression <- multiplicativeExpression (_* additiveOperator __* multiplicativeExpression)*
110multiplicativeExpression <- asExpression (_* multiplicativeOperator __* asExpression)*
111asExpression <- prefixUnaryExpression (__* asOperator __* type)*
112prefixUnaryExpression <- (unaryPrefix _*)* postfixUnaryExpression
113unaryPrefix <- annotation / label / prefixUnaryOperator __*
114postfixUnaryExpression <- primaryExpression (_* postfixUnarySuffix)+ / primaryExpression
115postfixUnarySuffix <- postfixUnaryOperator / typeArguments / callSuffix / indexingSuffix / navigationSuffix
116directlyAssignableExpression <- postfixUnaryExpression _* assignableSuffix / postfixUnaryExpression / simpleIdentifier / parenthesizedDirectlyAssignableExpression
117parenthesizedDirectlyAssignableExpression <- LPAREN __* inside_directlyAssignableExpression __* RPAREN
118assignableExpression <- prefixUnaryExpression / parenthesizedAssignableExpression
119parenthesizedAssignableExpression <- LPAREN __* inside_assignableExpression __* RPAREN
120assignableSuffix <- navigationSuffix / typeArguments / indexingSuffix
121indexingSuffix <- LSQUARE __* inside_expression (__* COMMA __* inside_expression)* (__* COMMA)? __* RSQUARE
122navigationSuffix <- __* memberAccessOperator __* (simpleIdentifier / parenthesizedExpression / CLASS)
123callSuffix <- typeArguments? _* valueArguments? _* annotatedLambda / typeArguments? _* valueArguments
124annotatedLambda <- annotation* _* label? __* lambdaLiteral
125typeArguments <- LANGLE __* typeProjection (__* COMMA __* typeProjection)* (__* COMMA)? __* RANGLE
126valueArguments <- LPAREN __* RPAREN / LPAREN __* inside_valueArgument (__* COMMA __* inside_valueArgument)* (__* COMMA)? __* RPAREN
127#valueArgument <- annotation? __* (simpleIdentifier __* ASSIGNMENT __*)? MULT? __* expression
128primaryExpression <- thisExpression / superExpression / ifExpression / whenExpression / tryExpression / jumpExpression / parenthesizedExpression/ callableReference / stringLiteral / functionLiteral / objectLiteral / collectionLiteral  / simpleIdentifier / literalConstant
129parenthesizedExpression <- LPAREN __* inside_expression __* RPAREN
130collectionLiteral <- LSQUARE __* inside_expression (__* COMMA __* inside_expression)* (__* COMMA)? __* RSQUARE / LSQUARE __* RSQUARE
131literalConstant <- BooleanLiteral / CharacterLiteral / NullLiteral / RealLiteral / UnsignedLiteral / LongLiteral / HexLiteral / BinLiteral / IntegerLiteral
132stringLiteral <- multiLineStringLiteral / lineStringLiteral
133lineStringLiteral <- QUOTE_OPEN (lineStringExpression / lineStringContent)* QUOTE_CLOSE
134#lineStringLiteral <- QUOTE_OPEN (lineStringExpression / EscapedIdentifier / UniCharacterLiteral / stringChar)* QUOTE_CLOSE
135multiLineStringLiteral <- TRIPLE_QUOTE_OPEN (multiLineStringExpression / multiLineStringContent / MultiLineStringQuote)* TRIPLE_QUOTE_CLOSE
136#multiLineStringLiteral <- TRIPLE_QUOTE_OPEN (multiLineStringExpression / MultiLineStringQuote / EscapedIdentifier / UniChracterLiteral / stringChar)* TRIPLE_QUOTE_CLOSE
137lineStringContent <- LineStrText / LineStrEscapedChar / LineStrRef
138lineStringExpression <- LineStrExprStart __* expression __* RCURL
139multiLineStringContent <- MultiLineStrRef / MultiLineStrText / MultiLineStringQuote
140multiLineStringExpression <- MultiLineStrExprStart __* expression __* RCURL
141
142inside_expression <- inside_disjunction
143inside_disjunction <- inside_conjunction (__* DISJ __* inside_conjunction)*
144inside_conjunction <- inside_equality (__* CONJ __* inside_equality)*
145inside_equality <- inside_comparison ((_ / NL)* equalityOperator __* inside_comparison (_ / NL)*)*
146inside_comparison <- inside_genericCallLikeComparison ((_ / NL)* comparisonOperator __* inside_genericCallLikeComparison (_ / NL)*)*
147inside_genericCallLikeComparison <- inside_infixOperation ((_ / NL)* callSuffix)*
148inside_infixOperation <- inside_elvisExpression ((_ / NL)* inOperator __* inside_elvisExpression / (_ / NL)* isOperator __* type)*
149inside_elvisExpression <- inside_infixFunctionCall (__* elvis __* inside_infixFunctionCall)*
150inside_infixFunctionCall <- inside_rangeExpression ((_ / NL)* simpleIdentifier __* inside_rangeExpression)*
151inside_rangeExpression <- inside_additiveExpression ((_ / NL)* RANGE __* inside_additiveExpression)*
152inside_additiveExpression <- inside_multiplicativeExpression ((_ / NL)* additiveOperator __* inside_multiplicativeExpression)*
153inside_multiplicativeExpression <- inside_asExpression ((_ / NL)* multiplicativeOperator __* inside_asExpression)*
154inside_asExpression <- inside_prefixUnaryExpression (__* asOperator __* type)*
155inside_prefixUnaryExpression <- (inside_unaryPrefix (_ / NL)*)* inside_postfixUnaryExpression
156inside_unaryPrefix <- annotation / label / prefixUnaryOperator __*
157inside_postfixUnaryExpression <- primaryExpression ((_ / NL)* inside_postfixUnarySuffix)+ / primaryExpression
158inside_postfixUnarySuffix <- postfixUnaryOperator / typeArguments / callSuffix / indexingSuffix / navigationSuffix
159inside_directlyAssignableExpression <- inside_postfixUnaryExpression (_ / NL)* assignableSuffix / inside_postfixUnaryExpression / simpleIdentifier / parenthesizedDirectlyAssignableExpression
160inside_assignableExpression <- inside_prefixUnaryExpression / parenthesizedAssignableExpression
161inside_valueArgument <- annotation? __* (simpleIdentifier __* ASSIGNMENT __*)? MULT? __* inside_expression
162
163
164#characterLiteral <- "'" (UniCharacterLiteral / EscapedIdentifier / [^\n\r'\\]) "'"
165#stringChar <- [^"]
166
167lambdaLiteral <- LCURL {printf("<lambda>\n");} __* statements __* RCURL / LCURL {printf("<lambda>\n");} __* lambdaParameters? __* ARROW __* statements __* RCURL
168lambdaParameters <- lambdaParameter (__* COMMA __* lambdaParameter)* (__* COMMA)?
169lambdaParameter <- variableDeclaration / multiVariableDeclaration (__* COLON __* type)?
170anonymousFunction <- FUN {printf("<anonymous function>");} (__* type __* DOT)? __* parametersWithOptionalType (__* COLON __* type)? (__* typeConstraints)? (__* functionBody)?
171functionLiteral <- lambdaLiteral / anonymousFunction
172objectLiteral <- OBJECT __* COLON __* delegationSpecifiers __* classBody / OBJECT __* classBody
173thisExpression <- THIS_AT / THIS !(Letter / UnicodeDigit)
174superExpression <- SUPER_AT / SUPER (LANGLE __* type __* RANGLE)? (AT_NO_WS simpleIdentifier)?
175ifExpression <- IF __* LPAREN __* expression __* RPAREN __* controlStructureBody? __* SEMICOLON? __* ELSE __* (controlStructureBody / SEMICOLON) / IF __* LPAREN __* expression __* RPAREN __* (controlStructureBody / SEMICOLON)
176whenSubject <- LPAREN (annotation* __* VAL __* variableDeclaration __* ASSIGNMENT __*)? expression RPAREN
177whenExpression <- WHEN __* whenSubject? __* LCURL __* (whenEntry __*)* __* RCURL
178whenEntry <- whenCondition (__* COMMA __* whenCondition)* (__* COMMA)? __* ARROW __* controlStructureBody semi? / ELSE __* ARROW __* controlStructureBody semi?
179whenCondition <- expression / rangeTest / typeTest
180rangeTest <- inOperator __* expression
181typeTest <- isOperator __* type
182tryExpression <- TRY __* block ((__* catchBlock)+ (__* finallyBlock)? / __* finallyBlock)
183catchBlock <- CATCH __* LPAREN _* (annotation _*)* simpleIdentifier _* COLON _* type (__* COMMA)? _* RPAREN __* block
184finallyBlock <- FINALLY __* block
185jumpExpression <- THROW __* expression / (RETURN_AT / RETURN) _* expression? / CONTINUE_AT / CONTINUE / BREAK_AT / BREAK
186callableReference <- (receiverType? __* COLONCOLON __* (simpleIdentifier / CLASS))
187assignmentAndOperator <- ADD_ASSIGNMENT / SUB_ASSIGNMENT / MULT_ASSIGNMENT / DIV_ASSIGNMENT / MOD_ASSIGNMENT
188equalityOperator <- EQEQEQ / EQEQ / EXCL_EQEQ / EXCL_EQ
189comparisonOperator <- LE / GE / LANGLE / RANGLE
190inOperator <- IN / NOT_IN
191isOperator <- IS / NOT_IS
192additiveOperator <- ADD / SUB
193multiplicativeOperator <- MULT / DIV / MOD
194asOperator <- AS_SAFE / AS
195prefixUnaryOperator <- INCR / DECR / SUB / ADD / excl
196postfixUnaryOperator <- INCR / DECR / EXCL_NO_WS excl
197excl <- EXCL_WS / EXCL_NO_WS
198memberAccessOperator <- DOT / safeNav / COLONCOLON
199safeNav <- QUEST_NO_WS DOT
200
201# // SECTION: modifiers
202modifiers <- (annotation / modifier)+
203parameterModifiers <- (annotation / parameterModifier)+
204modifier <- (classModifier / memberModifier / visibilityModifier / functionModifier / propertyModifier / inheritanceModifier / parameterModifier / platformModifier) __*
205typeModifiers <- typeModifier+
206typeModifier <- annotation / SUSPEND __*
207classModifier <- ENUM / SEALED / ANNOTATION / DATA / INNER
208memberModifier <- OVERRIDE / LATEINIT
209visibilityModifier <- PUBLIC / PRIVATE / INTERNAL / PROTECTED
210varianceModifier <- IN / OUT
211typeParameterModifiers <- typeParameterModifier+
212typeParameterModifier <- reificationModifier __* / varianceModifier __* / annotation
213functionModifier <- TAILREC / OPERATOR / INFIX / INLINE / EXTERNAL / SUSPEND
214propertyModifier <- CONST
215inheritanceModifier <- ABSTRACT / FINAL / OPEN
216parameterModifier <- VARARG / NOINLINE / CROSSINLINE
217reificationModifier <- REIFIED
218platformModifier <- EXPECT / ACTUAL
219
220# // SECTION: annotations
221annotation <- (singleAnnotation / multiAnnotation) __*
222singleAnnotation <- annotationUseSiteTarget __* unescapedAnnotation / (AT_NO_WS / AT_PRE_WS) unescapedAnnotation
223multiAnnotation <- annotationUseSiteTarget __* LSQUARE unescapedAnnotation+ RSQUARE / (AT_NO_WS / AT_PRE_WS) LSQUARE unescapedAnnotation+ RSQUARE
224annotationUseSiteTarget <- (AT_NO_WS / AT_PRE_WS) (FIELD / PROPERTY / GET / SET / RECEIVER / PARAM / SETPARAM / DELEGATE) __* COLON
225unescapedAnnotation <- constructorInvocation / userType
226
227# // SECTION: identifiers
228simpleIdentifier <- !(hardKeyword !(Letter / '_' / UnicodeDigit)) 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 / FIELD / PROPERTY / RECEIVER / PARAM / SETPARAM / DELEGATE / FILE / EXPECT / ACTUAL / CONST / SUSPEND
229identifier <- simpleIdentifier (__* DOT simpleIdentifier)*
230
231hardKeyword <- AS / BREAK / CLASS / CONTINUE / DO / ELSE / FOR / FUN / IF / IN / INTERFACE / IS / NullLiteral / OBJECT / PACKAGE / RETURN / SUPER / THIS / THROW / TRY / TYPE_ALIAS / TYPEOF / VAL / VAR / WHEN / WHILE / BooleanLiteral
232
233
234### Converted from peg/kotlin/KotlinLexer.g4
235
236
237# // SECTION: lexicalGeneral
238ShebangLine <- '#!' [^\r\n]*
239DelimitedComment <- '/*' (DelimitedComment / !'*/' .)* '*/'
240LineComment <- '//' [^\r\n]*
241#WS <- [\u0020\u0009\u000C]
242#NL <- '\n' / '\r' '\n'?
243Hidden <- DelimitedComment / LineComment / WS
244
245# // SECTION: separatorsAndOperations
246#RESERVED <- '...'
247DOT <- '.'
248COMMA <- ','
249LPAREN <- '('
250RPAREN <- ')'
251LSQUARE <- '['
252RSQUARE <- ']'
253LCURL <- '{'
254# /*
255# * When using another programming language (not Java) to generate a parser,
256# * please replace this code with the corresponding code of a programming language you are using.
257# */
258RCURL <- '}'
259MULT <- '*'
260MOD <- '%'
261DIV <- '/'
262ADD <- '+'
263SUB <- '-'
264INCR <- '++'
265DECR <- '--'
266CONJ <- '&&'
267DISJ <- '||'
268EXCL_WS <- '!' Hidden
269EXCL_NO_WS <- '!'
270COLON <- ':'
271SEMICOLON <- ';'
272ASSIGNMENT <- '=' !'='
273ADD_ASSIGNMENT <- '+='
274SUB_ASSIGNMENT <- '-='
275MULT_ASSIGNMENT <- '*='
276DIV_ASSIGNMENT <- '/='
277MOD_ASSIGNMENT <- '%='
278ARROW <- '->'
279#DOUBLE_ARROW <- '=>'
280RANGE <- '..'
281COLONCOLON <- '::'
282#DOUBLE_SEMICOLON <- ';;'
283#HASH <- '#'
284AT_NO_WS <- '@'
285AT_POST_WS <- '@' (Hidden / NL)
286AT_PRE_WS <- (Hidden / NL) '@'
287#AT_BOTH_WS <- (Hidden / NL) '@' (Hidden / NL)
288QUEST_WS <- '?' Hidden
289QUEST_NO_WS <- '?'
290LANGLE <- '<'
291RANGLE <- '>'
292LE <- '<='
293GE <- '>='
294EXCL_EQ <- '!='
295EXCL_EQEQ <- '!=='
296AS_SAFE <- 'as?'
297EQEQ <- '=='
298EQEQEQ <- '==='
299#SINGLE_QUOTE <- '\''
300
301# // SECTION: keywords
302RETURN_AT <- 'return@' Identifier
303CONTINUE_AT <- 'continue@' Identifier
304BREAK_AT <- 'break@' Identifier
305THIS_AT <- 'this@' Identifier
306SUPER_AT <- 'super@' Identifier
307FILE <- 'file' !(Letter / UnicodeDigit)
308FIELD <- 'field' !(Letter / UnicodeDigit)
309PROPERTY <- 'property' !(Letter / UnicodeDigit)
310GET <- 'get' !(Letter / UnicodeDigit)
311SET <- 'set' !(Letter / UnicodeDigit)
312RECEIVER <- 'receiver' !(Letter / UnicodeDigit)
313PARAM <- 'param' !(Letter / UnicodeDigit)
314SETPARAM <- 'setparam' !(Letter / UnicodeDigit)
315DELEGATE <- 'delegate' !(Letter / UnicodeDigit)
316PACKAGE <- 'package' !(Letter / UnicodeDigit)
317IMPORT <- 'import' !(Letter / UnicodeDigit)
318CLASS <- 'class' !(Letter / UnicodeDigit)
319INTERFACE <- 'interface' !(Letter / UnicodeDigit)
320FUN <- 'fun' !(Letter / UnicodeDigit)
321OBJECT <- 'object' !(Letter / UnicodeDigit)
322VAL <- 'val' !(Letter / UnicodeDigit)
323VAR <- 'var' !(Letter / UnicodeDigit)
324TYPE_ALIAS <- 'typealias' !(Letter / UnicodeDigit)
325CONSTRUCTOR <- 'constructor' !(Letter / UnicodeDigit)
326BY <- 'by' !(Letter / UnicodeDigit)
327COMPANION <- 'companion' !(Letter / UnicodeDigit)
328INIT <- 'init' !(Letter / UnicodeDigit)
329THIS <- 'this' !(Letter / UnicodeDigit)
330SUPER <- 'super' !(Letter / UnicodeDigit)
331TYPEOF <- 'typeof' !(Letter / UnicodeDigit)
332WHERE <- 'where' !(Letter / UnicodeDigit)
333IF <- 'if' !(Letter / UnicodeDigit)
334ELSE <- 'else' !(Letter / UnicodeDigit)
335WHEN <- 'when' !(Letter / UnicodeDigit)
336TRY <- 'try' !(Letter / UnicodeDigit)
337CATCH <- 'catch' !(Letter / UnicodeDigit)
338FINALLY <- 'finally' !(Letter / UnicodeDigit)
339FOR <- 'for' !(Letter / UnicodeDigit)
340DO <- 'do' !(Letter / UnicodeDigit)
341WHILE <- 'while' !(Letter / UnicodeDigit)
342THROW <- 'throw' !(Letter / UnicodeDigit)
343RETURN <- 'return' !(Letter / UnicodeDigit)
344CONTINUE <- 'continue' !(Letter / UnicodeDigit)
345BREAK <- 'break' !(Letter / UnicodeDigit)
346AS <- 'as' !(Letter / UnicodeDigit)
347IS <- 'is' !(Letter / UnicodeDigit)
348IN <- 'in' !(Letter / UnicodeDigit)
349NOT_IS <- '!is' !(Letter / UnicodeDigit)
350NOT_IN <- '!in' !(Letter / UnicodeDigit)
351OUT <- 'out' !(Letter / UnicodeDigit)
352DYNAMIC <- 'dynamic' !(Letter / UnicodeDigit)
353
354# // SECTION: lexicalModifiers
355PUBLIC <- 'public' !(Letter / UnicodeDigit)
356PRIVATE <- 'private' !(Letter / UnicodeDigit)
357PROTECTED <- 'protected' !(Letter / UnicodeDigit)
358INTERNAL <- 'internal' !(Letter / UnicodeDigit)
359ENUM <- 'enum' !(Letter / UnicodeDigit)
360SEALED <- 'sealed' !(Letter / UnicodeDigit)
361ANNOTATION <- 'annotation' !(Letter / UnicodeDigit)
362DATA <- 'data' !(Letter / UnicodeDigit)
363INNER <- 'inner' !(Letter / UnicodeDigit)
364TAILREC <- 'tailrec' !(Letter / UnicodeDigit)
365OPERATOR <- 'operator' !(Letter / UnicodeDigit)
366INLINE <- 'inline' !(Letter / UnicodeDigit)
367INFIX <- 'infix' !(Letter / UnicodeDigit)
368EXTERNAL <- 'external' !(Letter / UnicodeDigit)
369SUSPEND <- 'suspend' !(Letter / UnicodeDigit)
370OVERRIDE <- 'override' !(Letter / UnicodeDigit)
371ABSTRACT <- 'abstract' !(Letter / UnicodeDigit)
372FINAL <- 'final' !(Letter / UnicodeDigit)
373OPEN <- 'open' !(Letter / UnicodeDigit)
374CONST <- 'const' !(Letter / UnicodeDigit)
375LATEINIT <- 'lateinit' !(Letter / UnicodeDigit)
376VARARG <- 'vararg' !(Letter / UnicodeDigit)
377NOINLINE <- 'noinline' !(Letter / UnicodeDigit)
378CROSSINLINE <- 'crossinline' !(Letter / UnicodeDigit)
379REIFIED <- 'reified' !(Letter / UnicodeDigit)
380EXPECT <- 'expect' !(Letter / UnicodeDigit)
381ACTUAL <- 'actual' !(Letter / UnicodeDigit)
382
383# // SECTION: literals
384DecDigit <- [0-9]
385DecDigitNoZero <- [1-9]
386DecDigitOrSeparator <- DecDigit / '_'
387DecDigits <- DecDigit DecDigitOrSeparator* / DecDigit
388DoubleExponent <- [eE] [-+]? DecDigits
389RealLiteral <- FloatLiteral / DoubleLiteral
390FloatLiteral <- DoubleLiteral [fF] / DecDigits [fF]
391DoubleLiteral <- DecDigits? '.' DecDigits DoubleExponent? / DecDigits DoubleExponent
392IntegerLiteral <- DecDigitNoZero DecDigitOrSeparator* / DecDigit
393#IntegerLiteral <- DecDigitNoZero DecDigitOrSeparator* DecDigit / DecDigit
394HexDigit <- [0-9a-fA-F]
395HexDigitOrSeparator <- HexDigit / '_'
396HexLiteral <- '0' [xX] HexDigit HexDigitOrSeparator* / '0' [xX] HexDigit
397BinDigit <- [01]
398BinDigitOrSeparator <- BinDigit / '_'
399BinLiteral <- '0' [bB] BinDigit BinDigitOrSeparator* / '0' [bB] BinDigit
400UnsignedLiteral <- (HexLiteral / BinLiteral / IntegerLiteral) [uU] [lL]?
401LongLiteral <- (HexLiteral / BinLiteral / IntegerLiteral) [lL]
402BooleanLiteral <- 'true'/ 'false'
403NullLiteral <- 'null'
404CharacterLiteral <- '\'' (EscapeSeq / [^\n\r'\\]) '\''
405
406# // SECTION: lexicalIdentifiers
407#UnicodeDigit <- UNICODE_CLASS_ND
408Identifier <- '`' [^`\r\n]+ '`' / (Letter / '_') (Letter / '_' / UnicodeDigit)*
409IdentifierOrSoftKey <- Identifier / 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 / CONST / SUSPEND
410FieldIdentifier <- '$' IdentifierOrSoftKey
411UniCharacterLiteral <- '\\' 'u' HexDigit HexDigit HexDigit HexDigit
412EscapedIdentifier <- '\\' ('t' / 'b' / 'r' / 'n' / '\'' / '"' / '\\' / '$')
413EscapeSeq <- UniCharacterLiteral / EscapedIdentifier
414
415# // SECTION: characters
416Letter <- [\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376-\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06E5-\u06E6\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4-\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58-\u0C59\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E46\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400\u4DB5\u4E00\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A-\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]
417UnicodeDigit <- [\u0030-\u0039\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]
418
419# // SECTION: strings
420QUOTE_OPEN <- '"' !'""'
421TRIPLE_QUOTE_OPEN <- '"""'
422QUOTE_CLOSE <- '"'
423LineStrRef <- FieldIdentifier
424#LineStrText <- [^\\"$]+ / '$'
425LineStrText <- [^\\"$]+ / '$'
426LineStrEscapedChar <- EscapedIdentifier / UniCharacterLiteral
427LineStrExprStart <- '${'
428TRIPLE_QUOTE_CLOSE <- '"""""'/ '""""' / '"""'
429MultiLineStringQuote <- '""' !'"' / '"' !'""'
430MultiLineStrRef <- FieldIdentifier
431#MultiLineStrText <- !('"' / '$')+ / '$'
432MultiLineStrText <- [^"$]+ / '$'
433MultiLineStrExprStart <- '${'
434
435_ <- (WS / DelimitedComment / LineComment)+
436__ <- ([ \t\f\r\n] / DelimitedComment / LineComment)+
437WS <- [ \t\f]
438NL <- _* ('\n' / '\r' '\n'?) _*
439EOF <- !.
440
441%%
442
443int main(int argc, char **argv) {
444    int ret;
445    pcc_context_t *ctx = pcc_create(NULL);
446    while (pcc_parse(ctx, &ret));
447    pcc_destroy(ctx);
448    return 0;
449}
450