anchor.diff:  //	|	'(' expr ')'
   	;
   	
  -mulexpr	:	primexpr ('*'^ mulexpr | '/'^ mulexpr)?
  +mulexpr	:	('~'^ |'not'^ | NEGATION^)? primexpr ('*'^ mulexpr | '/'^ mulexpr 
  +		| '%'^ mulexpr | '<<'^ mulexpr | '>>'^ mulexpr | '|'^ mulexpr | '&'^ mulexpr | '^'^ mulexpr
  +		| 'or'^ mulexpr | 'and'^ mulexpr | 'xor'^ mulexpr)?
   	|	'('! expr ')'!
   	;
   	
   primexpr
   	:	literal
   	|	postf_op
  +	|	'sizeof' '(' typename ')'
  +	|	'ptr' '(' postf_op ')'
   	;
   	
   postf_op
  
positive.code: 	|	'strong' '[' typename ']' -> ^('strong' typename)
  	|	'weak' '[' typename ']'  -> ^('weak' typename)
  	|	'ptr' '[' typename ']'  -> ^('ptr' typename)
  	|	'array' '[' typename (',' expr)? ']'  -> ^('array' typename expr?)
  	|	'int' | 'uint' | 'uintptr' | 'int8' | 'int32' | 'uint32' | 'int16' | 'uint16' | 'int64' | 'uint64' | 'uint8'
  	;
  	
  	
  literal	
  	:	FLOAT | DOUBLE | INT | UINT | LONG | ULONG | LLONG | ULLONG | STRING | CHAR
  	;	
  
  expr	:	sum_expr
  
negative.code: 	FIELD_DECL;
  	VAR_TYPED; // variable with specified type name
  	VAR_ANY;
  	UNSIZED_ARRAY; // array size must be taken from initialization expression
  	SIZED_ARRAY;
  	NEGATION = '-';
  }
  
  
  