anchor.diff:  '==' '/=' '=<' '<' '>=' '>' '=:=' '=/=' '<='
   '<<' '>>'
   '!' '=' '::' '..' '...'
  +
  +'class_attributes' 'class_methods' % oo_markup
  +'public' 'protected' 'private' % oo_visibility
  +'final' 'static' % oo_access
  +
   'spec' 'callback' % helper
   dot.
   
  
positive.code: expr_700 -> record_expr : '$1'.
  expr_700 -> expr_800 : '$1'.
  
  expr_800 -> expr_900 ':' expr_max :
  	{remote,?line('$2'),'$1','$3'}.
  expr_800 -> expr_900 : '$1'.
  
negative.code: form -> attribute dot : '$1'.
  form -> function dot : '$1'.
  form -> rule dot : '$1'.
  form -> 'class_attributes' dot : '$1'.
  form ->      oo_attributes dot : '$1'.
  form ->    'class_methods' dot : '$1'.
  
  oo_attributes -> oo_attribute : ['$1'].
  oo_attributes -> oo_attribute ';' oo_attributes : ['$1'|'$3'].
  
  oo_attribute -> oo_var : {[], '$1'}.
  oo_attribute -> oo_modifier oo_var : {'$1','$2'}.
  
  oo_modifier -> oo_access                  : ['$1'].
  oo_modifier -> oo_access 'static'         : ['$1','$2'].
  oo_modifier -> oo_access 'static' 'final' : ['$1','$2','$3'].
  oo_modifier -> oo_access 'final'          : ['$1','$2'].
  
  oo_access -> 'public' : '$1'.
  oo_access -> 'private' : '$1'.
  oo_access -> 'protected' : '$1'.
  
  oo_var -> var                : {{atom, ?line('$1'), 'NoType'}, '$1'}.
  oo_var -> atom var           : {'$1', '$2'}.
  oo_var -> var '=' exprs      : {{atom, ?line('$1'), 'NoType'}, {match,?line('$2'),'$1','$3'}}.
  oo_var -> atom var '=' exprs : {$1, {match,?line('$3'),'$2','$4'}}.
  
  attribute -> '-' atom attr_val               : build_attribute('$2', '$3').
  attribute -> '-' atom typed_attr_val         : build_typed_attribute('$2','$3').
  