anchor.diff:  	| "r"^ LSQUARE! expr RSQUARE!
   	| "m"^ LSQUARE! expr RSQUARE!
   	| NAME^
  +	| NAME LSQUARE^ NAME RSQUARE!
   	| LPAREN! expr RPAREN!
   	| LSQUARE! expr QUEST^ expr COLON! expr RSQUARE!
  -	| "addr" LPAREN^ expr RPAREN!
  +	| NAME LPAREN^ expr_list RPAREN!
  +//	| "addr" LPAREN expr RPAREN
   //	| conv_func LPAREN num COMMA num COMMA expr RPAREN
   //	| transcend LPAREN expr RPAREN
  -	| NAME LPAREN^ exp_list RPAREN!
  -	| NAME LSQUARE^ NAME RSQUARE!
   	;
   
   // bit extraction, sign extension, cast
  
positive.code: 	;
  
  table_expr
  	: (str_table) => str_table
  	| opstr_table
  	| exprstr_table
  	;
  
  str_table
  	: primary_str_table (primary_str_table
  		{ ## = #(#[CROSSP,"CROSSP"], ##) }
  	  )*
  	;
  
  primary_str_table
  	: NAME
  	| LCURLY^ str_term (COMMA! str_term)* RCURLY!
  	;
  
  str_term
  	: NAME
  	| QUOTE QUOTE! { ## = #(##, #[NAME,""]) }
  	| QUOTE^ NAME QUOTE!
  	;
  
  opstr_table 
  	: LCURLY^ opstr_term (COMMA! t:opstr_term)* RCURLY!
  	;
  
  opstr_term
  	: QUOTE^ bin_oper QUOTE!
  	;
  
  
negative.code: 	: DECOR^
  	;
  
  // register transfer list
  rt_list
  	: (rt)+
  		{ ## = #(#[RTL,"RTL"], ##) }
  