Table of contents from Fischer's book, 2nd edition, 2010: chapter 1 Introduction 1.1 History of compilatioon 1.2 What compilers do 1.3 Interpreters 1.4 Syntax and semantics 1.5 Organization of a compiler 1.6 Programming language and compiler design 1.7 Computer architecture and compiler design 1.8 Compiler design considerations 1.9 Integrated development environments chapter 2 A simple compiler 2.1 An informal definition of the ac language 2.2 Formal definition of ac 2.3 Phases of a simple compiler 2.4 Scanning 2.5 Parsing 2.6 Abstract syntax trees 2.7 Semantic analysis 2.8 Code generation chapter 3 Scanning--Theory and practice 3.1 Overview of a scanner 3.2 Regular expressions 2.2 Examples 3.4 Finite automata and scanners 3.5 The lex scanner generator 3.6 Other scanner generators 3.7 Practical considerations of building scanners 3.8 Regular expressions and finite automata 3.9 Summary chapter 4 Grammars and parsing 4.1 Context-free grammars 4.2 Properties of CFGs 4.3 Transforming extended grammars 4.4 Parsers and recognizers 4.5 Grammar analysis algorithms chapter 5 Top-down parsing 5.1 Overview 5.2 LL(k) grammars 5.3 Recursive-descent LL(1) parsers 5.4 Table-driven LL(1) parsers 5.5 Obtaining LL(1) grammars 5.6 A non-LL(1) language 5.7 Properties of LL(1) parsers 5.8 Parse table representation 5.9 Syntactic error recovery and repair chapter 6 Bottom-up parsing 6.1 Overview 6.2 Shift-reduce parsers 6.3 LR(0) table construction 6.4 Conflict diagnosis 6.5 Conflict resolution and table construction chapter 7 Syntax-directed translation 7.1 Overview 7.2 Bottom-up syntax-directed translation 7.3 Top-down syntax-directed translation 7.4 Abstrtact syntax trees 7.5 AST design and construction 7.6 AST structures for left and right values 7.7 Design patterns for AST chapter 8 Symbol tables and declaration processing 8.1 Constructing a symbol table 8.2 Block-structured languages and scopes 8.3 Basic implementation techniques 8.4 Advanced features 8.5 Declaration processing fundamentals 8.6 Variable and type declarations 8.7 Class and method declaration 8.8 An introduction to type checking 8.9 Summary chapter 9 Semantic analysis 9.1 Semantic analysis for control structures 9.2 Semantic analysis of calls 9.3 Summary chapter 10 Intermediate representations 10.1 Overview 10.2 Java virtual machine 10.3 Static single assignment form chapter 11 Code generation for a virtual machine 11.1 Visitors for code generation 11.2 Class and method declarations 11.3 The methodbody visitor 11.4 The LHSVisitor chapter 12 Runtime support 12.1 Static allocation 12.2 Stack allocation 12.3 Arrays 12.4 Heap management 12.5 Region-based memory management chapter 13 Target code generation 13.1 Translating bytecode 13.2 translating expression trees 13.3 Register allocation 13.4 Code scheduling 13.5 Automatic instruction selection 13.6 Peephole optimization chapter 14 Program optimization 14.1 Overview 14.2 Control flow analysis 14.3 Introduction to data flow analysis 14.4 Data flow framework 14.5 Evaluation 14.6 Constant propagation 14.7 SSA form --