program =
	(line NEWLINE)...

line =
	assignment
 |	data_def
 |	data_pointer_assignment
 |	data_pointer_move
 |	PROGRAM_POINTER_DEF
 |	program_pointer_assignment
 |	goto
 |	program_pointer_storage_def

assign_dest =
	REGISTER
 |	DATA_POINTER
 |	CHANNEL

relational_op =
 	EQUAL
 |	NOT_EQUAL
 |	LESS_THAN
 |	GREATER_THAN
 |	LESS_THAN_OR_EQ
 |	GREATER_THAN_OR_EQ

expr_op =
	PLUS
 |	MINUS
 |	MULTIPLY
 |	DIVIDE
 |	relational_op

expr_arg =
	assign_dest
 |	NUMBER
 |	CONSTANT

expr =
	[ [ UMINUS ] expr_arg expr_op ] [ UMINUS ] expr_arg

assignment =
	assign_dest ASSIGN expr

data_def =
	DATA_POINTER_DEF BIGNUM

label =
	BIGNUM

position =
	NUMBER
 |	REGISTER
 |	DATA_POINTER

data_pointer_assignment =
	DATA_POINTER POINTS_TO label [ position ]
 |	DATA_POINTER ASSIGN PROGRAM_POINTER

data_pointer_move =
	DATA_POINTER PREVIOUS
 |	DATA_POINTER NEXT

program_pointer_assignment =
	PROGRAM_POINTER POINTS_TO label
 |	PROGRAM_POINTER ASSIGN DATA_POINTER

relational_expr =
	expr_arg relational_op expr_arg

goto =
	POINTS_TO PROGRAM_POINTER
 |	relational_expr POINTS_TO PROGRAM_POINTER

program_pointer_storage_def =
	PROG_POINTER_STORE_DEF BIGNUM

