Overview |
Chapter 1: Introduction |
Lexical Analysis (Scanning) |
Chapter 2:
- Sec. 2.1: The scanning process
- Sec. 2.2: Regular expressions
- Sec. 2.3: Finite automata (skip NFAs)
- Sec. 2.4: From regular expressions to DFAs (skip NFAs)
- Sec. 2.5: Implementation of a scanner
- Sec. 2.6: Using Lex (will be covered in a lab session)
|
Context-Free Grammars and Parsing |
Chapter 3:
- Sec. 3.1: The parsing process
- Sec. 3.2: Context-free grammars
- Sec. 3.3: Parse trees and abstract syntax trees
- Sec. 3.4: Ambiguity
- Sec. 3.5: Extended notations
|
Top-down Parsing |
Chapter 4:
- Sec. 4.1: Recursive Descent parsing
- Sec. 4.2: LL(1) parsing
- Sec. 4.3: FIRST and FOLLOW sets
|
Bottom-up Parsing |
Chapter 5:
- Sec. 5.1: Overview
- Sec. 5.2: Finite automata of LR(0) items
- Sec. 5.3: SLR(1) parsing
- Sec. 5.4: LR(1) and LALR(1) parsing
- Sec. 5.5: Using yacc (will be covered n a lab session)
|
Semantic Analysis |
Chapter 6:
- Sec. 6.1: Attributes and Attribute grammars
- Sec. 6.2: Algorithms for attribute computation
- Sec. 6.3: The symbol table
- Sec. 6.4: Type checking
|
Run-Time Environments |
Chapter 7:
- Sec. 7.1: Memory organization during execution
- Sec. 7.2: Fully static environments
- Sec. 7.3: Stack-based environments
|
Code Generation |
Chapter 8:
- Sec. 8.1: Intermediate code and data structures for code
generation
- Sec. 8.2: Basic code generation techniques
- Sec. 8.3: Code generation for data structure references
- Sec. 8.4: Code generation for control statements and
logical expressions
- Sec. 8.5: Code generation for procedure/function calls
- Sec. 8.9: A survey of code optimization techniques
|
Compiler Backend |
Notes:
- Code optimization techniques
- Machine code generation
- Register allocation
- Data flow analysis
|