program -> declaration* EOF ; # Declarations =============================================================== declaration -> varDecl | constDecl | function | enumDecl | statement ; varDecl -> "let" IDENTIFIER ( "," IDENTIFIER )* ( "=" expression )? ";" ; constDecl -> "const" IDENTIFIER ( "," IDENTIFIER )* "=" expression ";" ; enumDecl -> "enum" IDENTIFIER "{" ( IDENTIFIER ("," IDENTIFIER)* )? "}" ; function -> "func" IDENTIFIER "(" parameters? ")" block ; parameters -> param ( "," param )* ; param -> IDENTIFIER ( "?" | "=" expression )? # Statements ================================================================ statement -> exprStmt | ifStmt | whileStmt | forStmt | breakStmt | continueStmt | returnStmt | importStmt | block ; whileStmt -> "while" "(" expression ")" statement ; forStmt -> "for" "(" ( varDecl | exprStmt | ";" ) expression? ";" expression? ")" statement ; ifStmt -> "if" "(" expression ")" statement ( "else" statement )? ; breakStmt -> "break" ";"? ; continueStmt -> "continue" ";"? ; returnStmt -> "return" expression? ";"? ; block -> "{" declaration* "}" ; importStmt -> "import" STRING ";"? ; exprStmt -> expression ";"? ; # Expressions ================================================================ expression -> assignment ; assignment -> ( (call | indexing | memberAccess) "." )? IDENTIFIER "=" assignment | logic_or ; logic_or -> logic_and (("||" | "or") logic_and)* ; logic_and -> equality (("&&" | "and") equality)* ; equality -> comparison ( ( "!=" | "==" ) comparison )* ; comparison -> range ( ( ">" | ">=" | "<" | "<=" ) range )* ; range -> term ( ".." term )? term -> factor ( ( "-" | "+" ) factor )* ; factor -> expo ( ( "/" | "*" | "%" ) expo )* ; expo -> unary ("**" unary)* ; unary -> ( "!" | "-" ) unary | deIn_crement | indexing | lambda | memberAccess | call ; primary -> INTEGER | REAL | STRING | "true" | "false" | "null" | "(" expression ")" | array | dictionary | IDENTIFIER ; # Other Unary Expressions deIn_crement -> ("++" | "--") unary | unary ("++" | "--") ; indexing -> primary ( "[" expression "]" )* ; lambda -> "fn" "(" parameters? ")" "->" block ; memberAccess -> primary ("." IDENTIFIER)* ; call -> primary ( "(" arguments? ")" )* ; # Call Arguments arguments -> arg ( "," arg )* ; arg -> expression ("=" expression)? ; # Array Expressions array -> "[" (expression ("," expression)*)? "]" ; # Dictionary Expressions dictionary -> "{" ( keyValPair ("," keyValPair)* )? "}" ; keyValPair -> IDENTIFIER ":" expression ;