anchor.diff:      :   NAME_NAME ATTR_EQ ATTR_VALUE_START t=NAME ATTR_VALUE_END
           -> CONSTANTNAME[$t];
   
  +structdefine
  +    :   TAG_START_STRUCT struct_nameattribute anyattribute* TAG_CLOSE
  +    	doc=SHORTDOC?
  +        struct_add*
  +        TAG_END_STRUCT SHORTDOC*
  +        -> ^(CLASSDEF ^(DOC $doc) struct_nameattribute struct_add*);
  +
  +struct_nameattribute
  +    :   NAME_NAME ATTR_EQ ATTR_VALUE_START t=NAME ATTR_VALUE_END
  +        -> TYPENAME[$t, $t.text];
  +
  +struct_add
  +    :   TAG_START_ADD add_nameattribute add_typeattribute anyattribute* TAG_CLOSE
  +        doc=SHORTDOC?
  +        TAG_END_ADD SHORTDOC*
  +        -> ^(FIELDDEF ^(DOC $doc) add_typeattribute add_nameattribute);
  +
  +add_nameattribute
  +    :   NAME_NAME ATTR_EQ ATTR_VALUE_START t=NAME ATTR_VALUE_END
  +        -> VARIABLENAME[$t, $t.text];
  +
  +add_typeattribute
  +    :   NAME_TYPE ATTR_EQ ATTR_VALUE_START t=NAME ATTR_VALUE_END
  +        -> TYPENAME[$t, $t.text];
  +
   /*------------------------------------------------------------------
    * LEXER RULES
    *------------------------------------------------------------------*/
  
positive.code:     :   { !tagMode }?=> '</option>'
      ;
  
  TAG_CLOSE
      :   { tagMode }?=> '>' { tagMode = false; }
      ;
  
negative.code: 
  NAME_STORAGE
      :   { tagMode }?=> 'storage'
      ;
  
  NAME_TYPE
      :   { tagMode }?=> 'type'
      ;
  
  NAME
  