let despace_brace program =
let rec brace_despace depth tokens rtokens last =
if depth > 0 then
match tokens with
| SPACE(_)::rest -> brace_despace depth rest rtokens last
| NEWLINE::rest -> brace_despace depth rest rtokens last
| COLON::_ -> wsfail "Colon inside brace scoping."
| LBRACE::rest -> brace_despace (depth+1) rest (LBRACE::rtokens) last
| RBRACE::rest -> let rtokens = if depth = 1
then SPACE(last)::NEWLINE::RBRACE::rtokens
else RBRACE::rtokens in
brace_despace (depth-1) rest rtokens last
| token::rest -> brace_despace depth rest (token::rtokens) last
| [] -> List.rev rtokens
else
match tokens with
| SPACE(n)::rest -> brace_despace depth rest (SPACE(n)::rtokens) n
| LBRACE::rest -> brace_despace (depth+1) rest (LBRACE::rtokens) last
| token::rest -> brace_despace depth rest (token::rtokens) last
| [] -> List.rev rtokens in
brace_despace 0 program [] 0