anchor.diff:  
   let encode_char (c : char) =
     let cn = (int)c in
  -  if cn > 127 then sprintf "\\u%04x" cn
  +  if cn > 127 || cn=39 then sprintf "\\u%04x" cn
     else match cn with
       | 34 -> "\\\"" | 92 -> "\\\\"
       | 9 -> "\\t"   | 10 -> "\\n"
  
positive.code:   | JSE_Identifier(id) -> (text (jstr_escape id), 0)
    | JSE_Array(l) -> (enclose lbr rbr (pretty_print_elist l), 0)
    | JSE_Object(l) -> ((if List.length l > 0 then reduce [
      text "{"; hardline; (pretty_print_object l); text "}"] else text "{}"), 0)
    | JSE_Function(f) -> (parens (pretty_print_function f), 1)
    | JSE_Dot(e,i) -> let (s,p)=ppe e in (reduce [pt s (p>1); text "."; text (jstr_escape i)], 1)
    | JSE_Property(e,f) -> let (s,p) = ppe e in let (s1, p1) = ppe f in (reduce [pt s (p>1); enclose lbr rbr s1],1)
  
negative.code:     ); semi; ws;
      (match c with None -> empty | Some e -> pretty_print_exp e); semi; ws;
      (match l with None -> empty | Some e -> pretty_print_exp e)] |> parens;
      hardline; optws s]
  
    | JSS_Forin(i,e,s) -> reduce [ws; text "for"; reduce [
      (match i with JSF_Expression(f) -> pretty_print_exp_il f 
      | JSF_Declaration(l) -> List.map (fun (x,v) -> reduce [text "var"; ws; text (jstr_escape x);
          (match v with None->empty | Some v -> reduce [ws; text "="; ws; pretty_print_exp_cl v])])
      l |> combine comma); ws; colon; ws; pretty_print_exp e] |> parens;
      hardline; optws s]
  
    | JSS_With(e,s) -> reduce [ws; text "with"; parens (pretty_print_exp e); hardline; optws s]
  
    | JSS_Switch(e,def,cases) -> reduce [ws; text "switch"; parens (pretty_print_exp e); hardline;
        ws; text "{"; hardline; reduce [
          combine hardline (List.map (fun (e,l)->reduce [ws; text "case "; pretty_print_exp e; colon; hardline; nest 1 (pretty_print_statements l)]) cases);
          (match def with None -> empty | Some l -> reduce [ws; text "default:"; hardline; nest 1 (pretty_print_statements l)])
        ] |> nest 1; ws; text "}"]
  
    | JSS_Try(b,c,f) -> reduce [ws; text "try"; hardline; (pretty_print_statement b);
        (match c with Some (i,c) -> reduce [ws; text "catch"; parens (text i); hardline; (pretty_print_statement c)]| None -> empty);
        (match f with Some f -> reduce [ws; text "finally"; hardline; (pretty_print_statement f)] | None -> empty)]
  
    | JSS_Declaration(l) -> reduce [ws; text "var"; ws; combine comma (List.map
        (fun (i,v) -> reduce [text (jstr_escape i);
          (match v with None -> empty
          | Some v -> reduce [ws; text "="; ws; pretty_print_exp_cl v])]) l); semi]
  
    in reduce [(f p) ; hardline]
  
  and pretty_print_statements l = reduce (List.map pretty_print_statement l)
  
  