let block_merge lines =
    let add_semi = function
        | (n, toks, true-> (n, toks, truefalse)
        | (n, toks, false-> (n, toks, false, needs_semi toks) in
    let lines = List.map add_semi lines in
    let rec merge_blocks rblocks = function
        | (n1, line1, false, s1)::(n2, line2, colon, s2)::rest when n1 = n2 ->
            let newline = line1 @ (if s1 then [SEMIelse []) @ line2 in
            merge_blocks rblocks ((n1, newline, colon, s2)::rest)
        | (n, line, colon, _)::rest -> merge_blocks ((n, line, colon)::rblocks) rest
        | [] -> List.rev rblocks in
    merge_blocks [] lines