Following a slightly different path, "Modern compiler implementation" goes over several topics mentioned in the review (lexing, parsing, type checking, code optimization and generation, runtime environments aspects e.g. garbage collection).
There exists various flavors of the book (in ML, Java, and C).
I've found Pratt parsing meshes rather well with formal grammars. Anything that is better described by an operator precedence table rather than BNF should be handled by the Pratt parser, rest can be done with recursive decent.
There exists various flavors of the book (in ML, Java, and C).