anchor.diff:      @init {
           $enum_def::enumList=antlr3ListNew(1);
       }
  -	:	( ENUM enum_identifier BLOCK_OPEN enum_element+ BLOCK_CLOSE -> WS["\t"] enum_identifier COLON[":"] WS[" "] QUALIFIEDIDENTIFIER["PROTO.Enum"] PAREN_OPEN["("] QUOTE["\""] QUALIFIEDIDENTIFIER[qualifyType(ctx,$ENUM.text,$enum_def::enumName)] QUOTE["\""] COMMA[","] BLOCK_OPEN WS["\n"] (WS["\t"] enum_element)+ WS["\t"] BLOCK_CLOSE PAREN_CLOSE[")"] COMMA[","]WS["\n"] )
  +	:	( ENUM enum_identifier BLOCK_OPEN at_least_one_enum_element BLOCK_CLOSE -> WS["\t"] enum_identifier COLON[":"] WS[" "] QUALIFIEDIDENTIFIER["PROTO.Enum"] PAREN_OPEN["("] QUOTE["\""] QUALIFIEDIDENTIFIER[qualifyType(ctx,$ENUM.text,$enum_def::enumName)] QUOTE["\""] COMMA[","] BLOCK_OPEN WS["\n"] at_least_one_enum_element WS["\t"] BLOCK_CLOSE PAREN_CLOSE[")"] )
           {
               defineEnum( ctx, $message::messageName, $enum_def::enumName, $enum_def::enumList);
               $enum_def::enumList->free($enum_def::enumList);
               stringFree($enum_def::enumName);
           }
   	;
  +at_least_one_enum_element : enum_element zero_or_more_enum_elements;
  +zero_or_more_enum_elements : (enum_element* -> (WS[","] WS["\n"] enum_element)*);
   
   enum_element
  -	:	(IDENTIFIER EQUALS integer ITEM_TERMINATOR -> WS["\t"] IDENTIFIER WS[" "] COLON[":"] integer COMMA[","] WS["\n"] )
  +	:	(IDENTIFIER EQUALS integer ITEM_TERMINATOR -> WS["\t"] WS["\t"] IDENTIFIER WS[" "] COLON[":"] integer )
           {
               defineEnumValue( ctx, $message::messageName, $enum_def::enumName, $enum_def::enumList, $IDENTIFIER.text, $integer.text );
           }
  
positive.code:     @init {$field::defaultValue=NULL; $field::isNumericType=0;$field::isRepeated=0;$field::isRequired=0;}
      :
        ( ( multiplicity (multiplicitive_type|field_type) field_name EQUALS field_offset (default_value|none) ITEM_TERMINATOR )  
         -> WS["\t"] field_name COLON[":"] WS[" "] BLOCK_OPEN["{"] WS["\n\t\t"] IDENTIFIERCOLON["options:"] WS[" "] default_value none COMMA[","] WS["\n\t\t"] IDENTIFIERCOLON["multiplicity:"] WS[" "] QUALIFIEDIDENTIFIER["PROTO."] multiplicity COMMA[","] WS["\n\t\t"] IDENTIFIERCOLON["type:"] WS[" "] IDENTIFIER["function"] PAREN_OPEN["("]PAREN_CLOSE[")"] BLOCK_OPEN["{"] IDENTIFIER["return"] WS[" "] multiplicitive_type field_type ITEM_TERMINATOR[";"] BLOCK_CLOSE["}"] COMMA[","] WS["\n\t\t"] IDENTIFIERCOLON["id:"] WS[" "] field_offset WS["\n\t"] BLOCK_CLOSE["}"] COMMA[","] WS["\n"])
      { 
          if (($field::isRepeated||$field::isRequired)&&$field::defaultValue&&$field::defaultValue->len) {
             fprintf(stderr,"error: line \%d: default not allowed for repeated or optional elements in field \%s : \%s\n",$ITEM_TERMINATOR.line,$field::fieldName->chars,$field::defaultValue->chars);
  
negative.code: 
  extensions
          : 
          ( EXTENSIONS integer TO integer_inclusive ITEM_TERMINATOR -> WS[""] ) //WS["\t"] EXTENSIONS WS[" "] integer WS[" "] TO WS[" "] integer_inclusive ITEM_TERMINATOR WS["\n"] 
          {
              defineExtensionRange(ctx, $integer.text, $integer_inclusive.text);
          }
  