Program ::= {Statement}. Block ::= Statement | "{" {Statement} "}". Statement ::= (Definition | Assignment | Command | Control | Block) [";"]. Definition ::= {"local" | "const"} Var "=" Expr<0>. [[1]] Assignment ::= Var {LAccessor} "=" Expr<0>. Command ::= Var {LAccessor} Expr<0> {"," Expr<0>}. Control ::= "if" Expr<0> Block ["else" Block] | "while" Expr<0> Block . Expr ::= Expr {Op Expr}. Expr<4> ::= Primitive. Op<0> ::= "&" | "|". Op<1> ::= ">" | "<" | ">=" | "<=" | "=" | "!=". Op<2> ::= "+" | "-". Op<3> ::= "*" | "/" | "%". Primitive ::= "(" Expr<0> ")" | "!" Primitive | Var {RAccessor} | "^" {Var [","]} Block | "[" [Expr<0> {"," Expr<0>}] "]" | Literal . Literal ::= <> [[3]] | <> . Var ::= <>. [[4]] LAccessor ::= "[" Expr<0> "]" | "." Literal . RAccessor ::= "[" Expr<0> "]" | "." Literal | "(" [Expr<0> {"," Expr<0>}] ")" . Footnotes: [[1]]: Var must not itself be mentioned in the Expr<0>. [[3]]: Must start with lowercase letter. [[4]]: Must start with Uppercase letter.