anchor.diff:      .>> eof
   
   and internal pProtoStatement =
  +    choice [
           pSyntax
  -    <|> pImport
  -    <|> pPackage
  -    <|> pOptionStatement
  -    <|> pMessage
  -    <|> pEnum
  -    <|> (isProto2 >>. pExtend)
  -    <|> pService
  +        pImport
  +        pPackage
  +        pOptionStatement
  +        pMessage
  +        pEnum
  +        (isProto2 >>. pExtend)
  +        pService
  +        ]
   
   // Resolve recursive parsers
   do pMessageDefR := pMessageDefImpl
  
positive.code:     let pMessageMessage =
          pMessageDef |>> TMessageMessage
  
      (isProto2 >>. pGroup) // must be parsed first to avoid confusion
      <|> pField
      <|> pMessageEnum
      <|> pMessageMessage
      <|> (isProto2 >>. pMessageExtend)
      <|> (isProto2 >>. pExtensions)
      <|> pMessageOption
      <|> pOneOf
      <|> pMap
      <|> pReserved
  
  /// Parse message option: "option" (ident | "(" fullIdent ")" { "." ident }
  and pMessageOption =
  
negative.code:     let toKType s = ktypeMap.[s]
  
      let pKeyType_ws =
          ( choice [
              str "int32"   ; str "int64"     ;
              str "uint32"  ; str "uint64"    ;
              str "sint32"  ; str "sint64"    ;
              str "fixed32" ; str "fixed64"   ;
              str "sfixed32"; str "sfixed64"  ;
              str "bool"    ;
              str "string"
              ]
          ) .>> ws |>> toKType
  
      pipe4
  