// SPDX-FileCopyrightText: 2024 Himbeer // // SPDX-License-Identifier: CC-BY-NC-SA-4.0 root -> toplevel* toplevel -> function | externfunc function -> "export"? "func" IDENTIFIER "(" param? ")" IDENTIFIER block? param -> IDENTIFIER IDENTIFIER ( "," param )? externfunc -> "extern" "func" IDENTIFIER "(" signature? ")" IDENTIFIER ";" signature -> IDENTIFIER ( "," signature )? block -> "{" ( statement )* "}" statement -> ( return | declaration | assignment ) ";" return -> "return" expression declaration -> constant | mutable constant -> "const" IDENTIFIER "=" expression mutable -> "mut" IDENTIFIER "=" expression assignment -> assign | addassign | subassign | mulassign | divassign | remassign assign -> IDENTIFIER "=" expression addassign -> IDENTIFIER "+=" expression subassign -> IDENTIFIER "-=" expression mulassign -> IDENTIFIER "*=" expression divassign -> IDENTIFIER "/=" expression remassign -> IDENTIFIER "%=" expression expression -> equality equality -> comparison ( ( "==" | "!=" ) comparison )* comparison -> term ( ( "<" | "<=" | ">" | ">=" ) term )? term -> numeral ( ( "<<" | ">>" ) numeral )* numeral -> factor ( ( "+" | "-" ) factor )* factor -> unary ( ( "*" | "/" | "%" ) unary )* unary -> ( "-" | "!" | "~" )? primary primary -> grouping | literal | call | variable grouping -> "(" expression ")" literal -> string | number string -> STRING* number -> NUMBER IDENTIFIER call -> IDENTIFIER "(" arg? ")" arg -> expression ( "," arg )? variable -> IDENTIFIER