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