anchor.diff:              [ for res,restBuf,ctxt',pos in p2res -> res, restBuf, ctxt', pos ], []
           | p1res,err1 ->
             [ for res,restBuf,ctxt',pos in p1res -> res, restBuf, ctxt', pos ], []) |> Parser.Make
  +    (*
  +        The + function construct an error monad with the given two Parsers p1 and p2.
  +        
  +        The key difference between '++' and '+' is that the function '+' returns an Either monad whereas the '++' function simply returns the result of the first matched Parser.
  +        If neither matched an error is returned.
  +        If p1 matched, an Either Monad will be returned with it's First value as p1's match.
  +        if p2 matched, an Either monad will be returned with it's Second value as p2's match.
  +    *)
       static member (+) (p1:Parser<'a,'ctxt>, p2:Parser<'b,'ctxt>) : Parser<Either<'a,'b>,'ctxt> = 
        (fun buf ctxt p ->
           match p1.Parse buf ctxt p with
  
positive.code:           yield (k res).Parse restBuf ctxt' pos'
          ]
        out |> List.map fst |> List.concat, err @ (out |> List.map snd |> List.concat)) |> Parser.Make
    member this.Combine(p:Parser<'a,'ctxt>, k:Parser<'b,'ctxt>) : Parser<'b,'ctxt> =
     (fun buf ctxt pos ->
        let all_res,err = p.Parse buf ctxt pos
  
negative.code: 
  open Utilities
  
  (*
      A Position type holds the current line index while parsing.
      The Position is used as context for errors.
  *)
  type Position = { Line : int }
    with member this.NextLine = { this with Line = this.Line + 1 }
         static member Zero = { Line = 1 }
  