let block_merge lines =
let add_semi = function
| (n, toks, true) -> (n, toks, true, false)
| (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 [SEMI] else []) @ 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