A decent introduction into how programming languages are set up. Covers a lot of information about the conceptual building blocks of programming languages. The case studies work well to show how those abstract topics translate into actual language features. Would be even better with more modern examples (Rust, Java 11, C++14) since a lot has changed.