 
top-semi:	expression
		top-semi ; expression
 
expression:	impl-exp
		for-exp
		if-exp
 
for-exp:	for ( optname : variable ) { statements }
		rof ( optname : variable ) { statements }
 
if-exp:		if ( expression ) { statements }
		if ( expression ) { statements } else { statements } 
 
statements:	expression ;opt
		statements ;opt expression ;opt
 
impl-exp:	or-exp 
		impl-exp => or-exp
 
or-exp:		xor-exp
		or-exp |  xor-exp
		or-exp || xor-exp
 
xor-exp:	and-exp
		xor-exp ^ and-exp
 
and-exp:	eq-neq
		and-exp &  eq-neq
		and-exp && eq-neq
 
eq-neq:		gte-lte
		eq-neq == gte-lte
		eq-neq != gte-lte
 
gte-lte:	plus-minus
		gte-lte >= plus-minus
		gte-lte >  plus-minus
		gte-lte <= plus-minus
		gte-lte <  plus-minus
 
plus-minus:	mul-div
		plus-minus + mul-div
		plus-minus - mul-div
 
mul-div:	unary
		mul-div * unary
		mul-div / unary
		mul-div % unary
		mul-div . unary
 
unary:		! unary
		~ unary
		- unary
		( expression )
		number
		opt-num-arg
		opt-arg-ref
		opt-arg-add
		opt-arg-del
		string
		clarg-arg
		variable
		optname
 
clarg-arg:	?
 
number:		digit
		number digit
 
digit:		0 1 2 3 4 5 6 7 8 9
 
optname;	' chars '
		chars
 
opt-num-arg:	# optname
 
opt-arg-ref:	optname [ expression ]
 
opt-arg-add:	@ optname
		@ optname [ expression : expression ]
 
opt-arg-del:	$ optname
		$ optname [ expression ]
 
string:		"chars"
 
variable:	_charsordigitor_


