anchor.diff:    | QForall (bs, trigger, e1)
     | QExists (bs, trigger, e1) ->
         let binders_doc = p_binders true bs in
  -      let term_doc = p_noSeqTerm ps pb e1 in
  +      let term_doc = p_noSeqTermAndComment ps pb e1 in
         //VD: We could dispense with this pattern matching if we removed trailing whitespace after the fact
         (match trigger with
          | [] ->
  
positive.code:       (* Don't swallow semicolons on the left-hand side of a semicolon! Note:
         * the `false` for pb is kind of useless because there is no construct
         * that swallows branches but not semicolons (meaning ps implies pb). *)
        group (p_noSeqTerm true false e1 ^^ semi) ^/^ p_term ps pb e2
    | Bind(x, e1, e2) ->
        group ((p_lident x ^^ space ^^ long_left_arrow) ^/+^
        (p_noSeqTerm true false e1 ^^ space ^^ semi)) ^/^ p_term ps pb e2
    | _ ->
        group (p_noSeqTerm ps pb e)
  
  and p_noSeqTerm ps pb e = with_comment (p_noSeqTerm' ps pb) e e.range "!3"
  
  and p_noSeqTerm' ps pb e = match e.tm with
    | Ascribed (e, t, None) ->
  
negative.code:     soft_parens_with_nesting (p_term false false e)
    | _ when is_array e ->
      let es = extract_from_list e in
      surround 2 0 (lbracket ^^ bar) (separate_map_or_flow_last (semi ^^ break1) (fun ps -> p_noSeqTermAndComment ps false) es) (bar ^^ rbracket)
    | _ when is_list e ->
      surround 2 0 lbracket (separate_map_or_flow_last (semi ^^ break1) (fun ps -> p_noSeqTermAndComment ps false) (extract_from_list e)) rbracket
    | _ when is_lex_list e ->
      surround 2 1 (percent ^^ lbracket) (separate_map_or_flow_last (semi ^^ break1) (fun ps -> p_noSeqTermAndComment ps false) (extract_from_list e)) rbracket
    | _ when is_ref_set e ->
      let es = extract_from_ref_set e in
      surround 2 0 (bang ^^ lbrace) (separate_map_or_flow (comma ^^ break1) p_appTerm es) rbrace
  