| module |
= |
declaration* EOF |
; |
| declaration |
= |
classDecl | fnDecl | lambdaDecl | varDecl | moduleDecl | statement |
; |
| classDecl |
= |
"class" IDENTIFIER ( ":" IDENTIFIER )? "{" classMember* "}" |
; |
| classMember |
= |
function | fieldDecl |
; |
| fieldDecl |
= |
IDENTIFIER ( "=" expression )? ";" |
; |
| fnDecl |
= |
"fn" function |
; |
| function |
= |
IDENTIFIER "(" parameters? ")" block |
; |
| lambdaDecl |
= |
"var" IDENTIFIER "=" lambda |
; |
| lambda |
= |
"(" parameters? ")" "->" ( block | expression ) |
; |
| parameters |
= |
( IDENTIFIER | destructurePattern ) ( "," ( IDENTIFIER | destructurePattern ) )* ","? |
; |
| varDecl |
= |
"var" ( IDENTIFIER | destructurePattern ) ( "=" expression )? ";" |
; |
| moduleDecl |
= |
"mod" IDENTIFIER "=" "import" "(" STRING ")" ";" |
; |
| statement |
= |
exprStmt | block | ifStmt | whileStmt | forStmt | breakStmt | continueStmt | returnStmt |
; |
| exprStmt |
= |
expression ";" |
; |
| block |
= |
"{" declaration* "}" |
; |
| ifStmt |
= |
"if" "(" expression ")" statement ("else" statement)? |
; |
| whileStmt |
= |
"while" "(" expression ")" statement |
; |
| forStmt |
= |
"for" "(" ( varDecl | exprStmt | ";" ) expression? ";" expression? ")" statement |
; |
| returnStmt |
= |
"return" expression? ";" |
; |
| breakStmt |
= |
"break" ";" |
; |
| continueStmt |
= |
"continue" ";" |
; |
| expression |
= |
assignment |
; |
| assignment |
= |
( call "." IDENTIFIER | IDENTIFIER) ( "=" | "+=" | "-=" | "*=" | "/=" | "%=" ) assignment | pipe |
; |
| pipe |
= |
ternary ( "|>" pipe )? |
; |
| ternary |
= |
logicOr ( "?" expression ":" ternary )? |
; |
| logicOr |
= |
logicAnd ( "or" logicAnd)* |
; |
| logicAnd |
= |
equality ( "and" equality)* |
; |
| equality |
= |
comparison ( ( "!=" | "==" | "is" ) comparison)* |
; |
| comparison |
= |
term ( ( ">" | ">=" | "<" | "<=" ) term)* |
; |
| term |
= |
factor ( ( "+" | "-" ) factor )* |
; |
| factor |
= |
unary ( ( "/" | "*" | "%" ) unary )* |
; |
| unary |
= |
( "-" | "!" ) unary | call |
; |
| call |
= |
primary ( "(" arguments? ")" | "." IDENTIFIER | "?." IDENTIFIER | "[" expression "]" | "||" primary "->" expression "|" | "?|" primary "->" expression "|" )* |
; |
| arguments |
= |
expression ( "," expression )* ","? |
; |
| primary |
= |
NUMBER | STRING | "true" | "false" | "nil" | "this" | "(" expression ")" | IDENTIFIER | "super" | "super" "." IDENTIFIER | lambda | arrayLiteral | objectLiteral | whenExpr |
; |
| arrayLiteral |
= |
"[" ( expression ( "," expression )* ","? )? "]" |
; |
| objectLiteral |
= |
"{{" ( objectField ( "," objectField )* ","? )? "}}" |
; |
| objectField |
= |
IDENTIFIER ( "=" expression )? |
; |
| whenExpr |
= |
"when" ( "(" expression ")" )? "{" whenBranch* ( "else" "=>" expression ","? )? "}" |
; |
| whenBranch |
= |
( "is" ( IDENTIFIER | "STRING" | "NUMBER" | "BOOLEAN" | "ARRAY" | "OBJECT" | "FUNCTION" | "CLASS" | "MODULE" | "NIL" ) | expression ) "=>" expression ","? |
; |