anchor.diff:  
   let rec atleast n prs i =
       (if n <= 0 then many prs
  -     else prs ++ atleast (n - 1) prs >> (fun (h,t) -> h :: t)) i
  +     else prs .>>. atleast (n - 1) prs >> (fun (h,t) -> h :: t)) i
   
   let finished input =
       if input = [] then 0, input
  
positive.code:     | _ -> failwith "lex:unrecognized OCaml-style escape in string"
    let stringchar =
        some (fun i -> i <> "\\" && i <> "\"")
        || (a "\\" ++ escapecode >> snd) in
    let string = a "\"" ++ many stringchar ++ a "\"" >> (fun ((_,s),_) -> "\""^implode s^"\"")
    let rawtoken = (string || some isbra || septok || ident) >> (fun x -> Ident x)
    let simptoken = many (some isspace) ++ rawtoken >> (reserve << snd)
    let rec tokens i =
      try let (t,rst) = simptoken i in
          if t = !comment_token then
            (many (fun i -> if i <> [] && hd i <> "\n" then 1,tl i
                            else raise Noparse) ++ tokens >> snd) rst
          else
            let toks,rst1 = tokens rst in t::toks,rst1
      with Noparse -> [],i in
    fst << (tokens ++ many (some isspace) ++ finished >> (fst << fst))
  
  (* ------------------------------------------------------------------------- *)
  (* Parser for pretypes. Concrete syntax:                                     *)
  
negative.code:     let evs =
        let fvs = pfrees fabs []
        let bvs = pfrees babs []
        if length fvs <= 1 || bvs = [] then fvs
        else intersect fvs bvs
      pmk_setcompr (fabs,evs,babs)
    let rec mk_precedence infxs prs inp =
  