Skip to content

Grammar Reference

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 ","? ;