Program ::= Statement+ Statement ::= (AssignmentStatement | ImportDeclaration | ExternDeclaration | FunctionCallStatement | IfStatement | WhileStatement | ReturnStatement) SEMICOLON AssignmentStatement ::= ("let")? ("*")? Expression EQUALS Expression ImportDeclaration ::= "import" STRING ExternDeclaration ::= "extern" IDENTIFIER EQUALS Type FunctionCallStatement ::= (IDENTIFIER | FunctionDefinition) LPAREN FunctionArguments? RPAREN IfStatement ::= "if" Expression LBRACE Statement* RBRACE -- TODO: Should function definitions be allowed? WhileStatement ::= "while" Expression LBRACE Statement* RBRACE ReturnStatement ::= RETURN Expression FunctionArguments ::= Expression ("," Expression)* Expression ::= EqualityExpression | AdditiveExpression EqualityExpression ::= AdditiveExpression ("==" | "<" | ">") AdditiveExpression AdditiveExpression ::= MultiplicativeExpression (("+" | "-") MultiplicativeExpression)* MultiplicativeExpression ::= UnaryExpression (("*" | "/" | "%") UnaryExpression)* UnaryExpression ::= ("!" | "-" | "*") UnaryExpression | PrimaryExpression PrimaryExpression ::= NUMBER | BOOLEAN | CHAR | STRING | IDENTIFIER | FunctionCallStatement | FunctionDefinition | LPAREN Expression RPAREN FunctionDefinition ::= LPAREN FunctionParameters? RPAREN ARROW IDENTIFIER LBRACE Statement* ReturnStatement SEMICOLON RBRACE FunctionParameters ::= IDENTIFIER ":" Type ("," IDENTIFIER ":" Type)* Type ::= IDENTIFIER | FunctionType FunctionType ::= LPAREN (Type ("," Type)*)? RPAREN ARROW Type ParameterTypes ::= Type ("," Type)*