Yesterday I finished rewriting my CSS layout grammars to be functionally pure (and restrict almost all iteration to that over nodes): with a bit more work, I think you can represent them in the language of Rep's very simple grammars (though not if you want good parallelism ;-)). This is important because, if I generate solvers based on such a grammar, it's ok to only support a restricted language. Result 1: win!
Today, I've been extending my documentation on the grammars. Part of this is the negative space. I haven't even read the specification of margins/padding/clearance/tables. I remembered that, while I also don't handle overflow (visible, auto, scroll, hidden) and exotic positioning styles (absolute, fixed, etc.), they didn't seem hard. Beyond some interactions with floats, they weren't -- haven't created new language levels with them yet, but added the informal intuition of what changes. Result 2: win!
I already have floats (well, left-floats), inlines, and boxes. Now just tables, margins, and padding, and we'll support most websites! That means there's a pure, linear time representation of CSS with clear (speculative) data parallelism and a simple language -- making it incremental and parallel might not be so bad. Still worried about the renderer..
Almost done with our extended TR, just want to add the translation from CSS to BSS. Looking good :D Worst-case scenario, I drop out of grad school and become a CSS consultant.