Program ::= Statement+ Statement ::= (AssignmentStatement | PrintStatement | FunctionCallStatement) SEMICOLON AssignmentStatement ::= "let" IDENTIFIER EQUALS Expression PrintStatement ::= PRINT LPAREN Expression RPAREN -- TODO: this won't be needed once functions support arguments FunctionCallStatement ::= IDENTIFIER LPAREN RPAREN Expression ::= AdditiveExpression | FunctionDefinition AdditiveExpression ::= PrimaryExpression ("+" AdditiveExpression) PrimaryExpression ::= NUMBER | IDENTIFIER | FunctionCallStatement FunctionDefinition ::= ARROW LBRACE Statement* ReturnStatement RBRACE ReturnStatement ::= RETURN Expression SEMICOLON --TODO: I dont like this