Table of contents from Fischer's book: chapter 1 Introduction 1.1 Overview and history 1.2 What do compilers do? 1.3 The structure of a compiler 1.4 The syntax and semantics of a programming language 1.5 Compiler design and programming language design 1.6 Compiler classification 1.7 Influences on computer design chapter 2 A simple compiler 2.1 The structure of a Micro compiler 2.2 A Micro scanner 2.3 The syntax of Micro 2.4 Recursive decent parsing 2.5 Translating Micro chapter 3 Scanning--Theory and practice 3.1 Overview 3.2 Regular expressions 3.3 Finite automata and scanners 3.4 Using a scanner generator 3.5 Practical considerations 3.6 Translating regular expressions into finite automata chapter 4 Grammars and parsing 4.1 Context-free grammars: Concepts and notation 4.2 Errors in context-free grammars 4.3 Transforming extended BNF grammars 4.4 Parsers and recognizers 4.5 Grammar analysis algorithms chapter 5 LL(1) grammars and parsers 5.1 The LL(1) predict function 5.2 The LL(1) parse table 5.3 Building recursive descent parsers from LL(1) tables 5.4 An LL(1) parser driver 5.5 LL(1) action symbols 5.6 Making grammars LL(1) 5.7 The if-then-else problem in LL(1) parsing 5.8 The llgen parser generator 5.9 Properties of LL(1) parsers 5.10 LL(k) parsing chapter 6 LR parsing 6.1 Shift-reduce parsers 6.2 LR parsers 6.3 LR(1) parsing 6.4 SLR(1) parsing 6.5 LALR(1) parsing 6.6 Calling semantic routines in shift-reduce parsers 6.7 Using a parser generator 6.8 Optimizing parse tables 6.9 Practical LR(1) parsers 6.10 Properties of LR parsing 6.11 LL(1) or LALR(1), that is the question 6.12 Other shift-reduce techniques chapter 7 Semantic processing 7.1 Syntax-directed translation 7.2 Semantic processing techniques 7.3 Intermediate representations and code generation chapter 8 Symbol tables 8.1 A symbol table interface 8.2 Basic implementation techniques 8.3 Block-structured symbol tables 8.4 Extensions to block-structured symbol tables 8.5 Implicit declarations 8.6 Overloading 8.7 Forward references 8.8 Summary chapter 9 Run-Time storage organization 9.1 Static allocation 9.2 Stack allocation 9.3 Heap allocation 9.4 Program layout in memory 9.5 Static and dynamic chains 9.6 Formal procedures chapter 10 Processing declarations 10.1 Declaration processing fundamentals 10.2 Action routines for simple declarations 10.3 Action routines for advanced features chapter 11 Processing expressions and data structure references 11.1 Introduction 11.2 Action routines for simple names, expressions and data structures 11.3 Action routines for advanced features chapter 12 Translating control structures 12.1 if statements 12.2 loops 12.3 Compiling exits 12.4 The case statements 12.5 Compiling goto statements 12.6 Exception handling 12.7 Short-circuit boolean expressions chapter 13 Translating procedures and functions 13.1 Simple subprograms 13.2 Passing parameters to subprograms 13.3 Processing subprogram calls and parameter lists 13.4 subprogram invocation 13.5 label parameters 13.6 Name parameters chapter 14 Attribute grammars and multipass translation 14.1 Attribute grammars 14.2 Tree-structured intermediate representations chapter 15 Code generation and local code optimization 15.1 An overview 15.2 Register and temporary management 15.3 A simple code generator 15.4 Interpretive code generation 15.5 Peephole optimization 15.6 Generating code from trees 15.7 Generating code from dags 15.8 Code generator generators chapter 16 Global optimization 16.1 An overview--Goals and limits 16.2 Optimizing subprogram calls 16.3 Loop optimization 16.4 Global data flow analysis 16.5 Putting it all together chapter 17 Parsing in the real world 1.1 Compacting tables 1.2 Syntactic error recover and repair Appendix Compiler development tools: lex, yacc, scangen, llgen, etc. --