* Strong coverage of formal languages. The target languages (one is stack-oriented like Java's bytecode; the other is register oriented) are very easy to learn but are sufficiently powerful to support advanced compiler projects* Provides numerous, well-defined projects along with test cases.