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