anchor.diff:  module FStar.Parser.ToDocument
   
   open FStar
  +open FStar.Util
   open FStar.Parser.AST
   open FStar.Ident
   open FStar.Const
  
positive.code:       decls |> List.map doc_of_decl |> separate hardline
  
  
  (* Automatic level assignment *)
  (* would be perfect with a little of staging... *)
  
  type associativity =
      | Left
      | Right
      | NonAssoc
  
  type token = either<FStar.Char.char, string>
  type associativity_level = associativity * list<token>
  
  let assign_levels (token_associativity_spec : list<associativity_level>) : string -> int * int * int =
      let levels_from_associativity (l:int) = function
          | Left -> l, l, l-1
          | Right -> l-1, l, l
          | NonAssoc -> l, l, l
      in
      let level_table =
          List.mapi (fun i (assoc, tokens) -> (levels_from_associativity i assoc, tokens)) token_associativity_spec
      in
      let matches_token s = function
          | Inl c -> s.[0] = c
          | Inl s' -> s = s'
      in
      let matches_level s (assoc_levels, tokens) =
          List.existsb (matches_token s) tokens
      in
      function s ->
          match List.find (matches_level s) with
              | Some assoc_levels -> assoc_levels
              | _ -> failwith ("Unrecognized operator " ^ s)
  
  let level_of_operator =
      let spec = [
          Left,  [Inl '*' ; Inl '/' ; Inl '%'];
          Left,  [Inl '+' ; Inl '-' ];
          Right, [Inl '@' Inl '^'] ;
          Left,  [Inr "|>"] ;
          Left,  [Inl '$'] ;
          Left,  [Inl '=' ; Inl '<' ; Inl '>'] ;
          Left,  [Inl '&'] ;
          Left,  [Inl '|']
          ]
      in assign_levels spec
  
negative.code:       0, 0, -1
    | '|' ->
        -1, -1, -2
    | _ ->
        failwith ("invalid first character for infix operator " ^ op)
  
  