anchor.diff:      let pMessageMessage =
           pMessageDef |>> TMessageMessage
   
  -    (isProto2 >>. pGroup) // must be parsed first to avoid confusion
  -    <|> pField
  -    <|> pMessageEnum
  -    <|> pMessageMessage
  -    <|> (isProto2 >>. pMessageExtend)
  -    <|> (isProto2 >>. pExtensions)
  -    <|> pMessageOption
  -    <|> pOneOf
  -    <|> pMap
  -    <|> pReserved
  +    choice [
  +        (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 =
  
positive.code:     let toKType s = ktypeMap.[s]
  
      let pKeyType_ws =
          (
              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
  
negative.code:     .>> eof
  
  and internal pProtoStatement =
      choice [
          pSyntax
          pImport
          pPackage
          pOptionStatement
          pMessage
          pEnum
          (isProto2 >>. pExtend)
          pService
          ]
  
  // Resolve recursive parsers
  do pMessageDefR := pMessageDefImpl
  