val 0.3.0

An arbitrary precision calculator language
Documentation
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' | '_'