You're treating do, if, foreach as if they were keywords. I'm not entirely sure that that's still the case. And you're also forgetting the possibility of user implemented control type operators/methods.
Unless I'm very much mistaken you're suggesting that we special case the parser for 'do' and any user defined functions that take a block can go hang. Which I'm really not keen on. -- Piers "It is a truth universally acknowledged that a language in possession of a rich syntax must be in need of a rewrite." -- Jane Austen?