anchor.diff:      ;
   
   ATTR_EQ
  -    :   { tagMode }?=> '='
  +    :   { tagMode && !attrMode }?=> '='
       ;
   
   ATTR_VALUE_START
  
positive.code:     ;
  
  NAME
      :   { tagMode }?=> (UCLETTER | LCLETTER) (UCLETTER | LCLETTER | DIGIT | '_')*
      ;
  
  HEADER_XML
      :   { !tagMode }?=> '<?xml' .* '?>'
  
negative.code:     :   NAME_TYPE ATTR_EQ ATTR_VALUE_START t=NAME ATTR_VALUE_END
          -> TYPENAME[$t, $t.text];
  
  expression
      :   NAME
      |   INT
      |   FLOAT
      |   e1=expression OP_EQ e2=expression
      |   e1=expression OP_NEQ e2=expression
      |   e1=expression OP_LOGICAL_AND e2=expression
      |   e1=expression OP_BITWISE_AND e2=expression
      |   e1=expression OP_LOGICAL_OR e2=expression
      |   e1=expression OP_BITWISE_OR e2=expression
      |   OP_NOT e1=expression
      |   LBRACKET e1=expression RBRACKET
      ;
  
  /*------------------------------------------------------------------
   * LEXER RULES
   *------------------------------------------------------------------*/
  