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<N> ::= Expr<N+1> {Op<N> Expr<N+1>}.
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 ::= <<symbol>> [[3]]
| <<number>>
.
Var ::= <<symbol>>. [[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.