anchor.diff:      ;
   
   NAME
  -    :   { tagMode }?=> (UCLETTER | LCLETTER) (UCLETTER | LCLETTER | DIGIT | '_')*
  -    ;
  +    :   { 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' .* '?>'
  
positive.code: 
  // extra attributes that we throw away
  anyattribute
      :   NAME ATTR_EQ ATTR_VALUE_START .* ATTR_VALUE_END
      ;
  
  declarations
  
negative.code:     ;
  
  ATTR_EQ
      :   { tagMode && !attrMode }?=> '='
      ;
  
  ATTR_VALUE_START
  