#BNF ##RULES RootNode(aka Program) = Statement | Statement* ; Statement = Let_Statement | Expression_Statement | Block_Statement | Return_Statement ; Let_Statement = Token_let Identifier Token_Assignment Expression ; ex) let foo = 20; Expression_Statement = Expression (;) ; ex) 20; , 20 + 30; , call_fn(foo) Block_Statement = { Statement* } ; Return_Statement = return (Expression) ; Expression = Identifier_Expression | Infix_Expression | Prefix_Expression | Call_Expression | Index_Expression | If_Expression | Literal_Expression ; Identifier_Expression = Identifier ; Infix_Expression = Expression Infix_Operator Expression ex) 1 + 2, a - b, big >= small, ... Prefix_Expression = Prefix_Operator Expression ex) -100, !true, !false Call_Expression = Identifier ( Expression* ) | Function_Literal ( Expression* ) ex) some_fn(arg), another() , fn { return foo; } If_Expression = if ( Expression ) Block_Statement ( else Block_Statement ) ex) if (flag == true) { return foo } ex) if (flag == true) { foo } else { return 20; } Index_Expression = Identifier [ Expression ] | Array_Literal [ Expression ] Literal_Expression = Integer_Literal | Boolean_Literal | String_Literal | Function_Literal | Array_Literal Integer_Literal = (-) [ 0..=9 ] * ; String_Literal = "( [a-z|A-Z|0-9] * )" ; Boolean_Literal = true | false ; Function_Literal = fn (Identifier) ( (Identifier*) ) Block_Statement ; Array_Literal = [Expression (,Expression)* ]