PROGRAM <- _ STATEMENTS STATEMENTS <- (STATEMENT (';' _)?)* STATEMENT <- DEBUGGER / RETURN / EXPRESSION DEBUGGER <- debugger RETURN <- return End _ / return EXPRESSION EXPRESSION <- ASSIGNMENT / LOGICAL_OR ASSIGNMENT <- MUTABLE PRIMARY (ARGUMENTS / INDEX / DOT)* '=' _ EXPRESSION LOGICAL_OR <- LOGICAL_AND ('||' _ LOGICAL_AND)* LOGICAL_AND <- CONDITION ('&&' _ CONDITION)* CONDITION <- ADDITIVE (CONDITION_OPERATOR ADDITIVE)* ADDITIVE <- UNARY_PLUS (ADDITIVE_OPERATOR UNARY_PLUS)* UNARY_PLUS <- UNARY_PLUS_OPERATOR? UNARY_MINUS UNARY_MINUS <- UNARY_MINUS_OPERATOR? UNARY_NOT UNARY_NOT <- UNARY_NOT_OPERATOR? MULTIPLICATIVE MULTIPLICATIVE <- CALL (MULTIPLICATIVE_OPERATOR CALL)* CALL <- PRIMARY (ARGUMENTS / INDEX / DOT)* ARGUMENTS <- '(' _ (EXPRESSION (',' _ EXPRESSION)*)? ')' _ INDEX <- '[' _ EXPRESSION ']' _ DOT <- '.' _ IDENTIFIER WHILE <- while EXPRESSION BLOCK IF <- if EXPRESSION BLOCK (else if EXPRESSION BLOCK)* (else BLOCK)? PRIMARY <- WHILE / IF / FUNCTION / OBJECT / ARRAY / UNDEFINED / BOOLEAN / NUMBER / IDENTIFIER / STRING / INTERPOLATED_STRING / '(' _ EXPRESSION ')' _ FUNCTION <- fn PARAMETERS BLOCK PARAMETERS <- '(' _ (PARAMETER (',' _ PARAMETER)*)? ')' _ PARAMETER <- MUTABLE IDENTIFIER BLOCK <- '{' _ STATEMENTS '}' _ CONDITION_OPERATOR <- < ('==' / '!=' / '<=' / '<' / '>=' / '>') > _ ADDITIVE_OPERATOR <- < [-+] > _ UNARY_PLUS_OPERATOR <- < '+' > _ UNARY_MINUS_OPERATOR <- < '-' > _ UNARY_NOT_OPERATOR <- < '!' > _ MULTIPLICATIVE_OPERATOR <- < [*/%] > _ IDENTIFIER <- < IdentInitChar IdentChar* > _ OBJECT <- '{' _ (OBJECT_PROPERTY (',' _ OBJECT_PROPERTY)*)? '}' _ OBJECT_PROPERTY <- MUTABLE IDENTIFIER ':' _ EXPRESSION ARRAY <- '[' _ (EXPRESSION (',' _ EXPRESSION)*)? ']' _ UNDEFINED <- < 'undefined' > __ BOOLEAN <- < ('true' / 'false') > __ MUTABLE <- (< 'mut' > __)? ~debugger <- 'debugger' __ ~return <- 'return' !IdentInitChar Space* ~while <- 'while' __ ~if <- 'if' __ ~else <- 'else' __ ~fn <- 'fn' __ NUMBER <- < [0-9]+ > _ STRING <- ['] < (!['] .)* > ['] _ INTERPOLATED_STRING <- '"' ('{' _ EXPRESSION '}' / INTERPOLATED_CONTENT)* '"' _ INTERPOLATED_CONTENT <- (!["{] .) (!["{] .)* ~_ <- (Space / End)* __ <- !IdentInitChar (Space / End)* ~Space <- ' ' / '\t' / Comment ~End <- EndOfLine / EndOfFile Comment <- '/*' (!'*/' .)* '*/' / ('#' / '//') (!End .)* &End EndOfLine <- '\r\n' / '\n' / '\r' EndOfFile <- !. IdentInitChar <- [a-zA-Z_] IdentChar <- [a-zA-Z0-9_]