Program → Statement (';' Statement)* ';'?
Statement → Assignment | Block | ExpressionStmt | Function | If | Return | While
Assignment → Identifier '=' Expression
Block → '{' Statement* '}'
ExpressionStmt → Expression
Function → 'fn' Identifier '(' (Identifier (',' Identifier)*)? ','? ')' '{' Statement* '}'
If → 'if' '(' Expression ')' '{' Statement* '}' ('else' '{' Statement* '}')?
Return → 'return' Expression?
While → 'while' '(' Expression ')' '{' Statement* '}'
Expression → LogicalOr
LogicalOr → LogicalOr '||' LogicalAnd | LogicalAnd
LogicalAnd → LogicalAnd '&&' Equality | Equality
Equality → Equality ('==' | '!=') Relational | Relational
Relational → Relational ('>=' | '<=' | '>' | '<') Sum | Sum
Sum → Sum ('+' | '-') Product | Product
Product → Product ('*' | '/' | '%' | '^') Unary | Unary
Unary → ('-' | '!') Unary | ListAccess
ListAccess → Atom ('[' Expression ']')* | Atom
Atom → Number | Boolean | String | List | FunctionCall | Identifier | '(' Expression ')'
Number → Digit+ ('.' Digit+)?
Boolean → 'true' | 'false'
String → '"' [^"]* '"' | "'" [^']* "'"
List → '[' (Expression (',' Expression)*)? ','? ']'
FunctionCall → Identifier '(' (Expression (',' Expression)*)? ','? ')'
Identifier → Letter (Letter | Digit)*
Digit → '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
Letter → 'a' | 'b' | ... | 'z' | 'A' | 'B' | ... | 'Z' | '_'