January 25. Introduction to the course.
Reading: Aho et al., chapter 1 (pages 1-38).
January 27. The structure of a compiler; the structure of a programming
language.
Reading: Aho et al., chapter 2 through section 2.3 (pages 39-60).
January 29. Syntax-directed translation.
Reading: Aho et al., sections 2.4 and 2.5 (pages 60-76).
February 1. Simple parsing strategies.
Reading: The GNU make manual, chapters 1 through 6, sections
9.1 through 9.6, sections 10.1 through 10.6, and chapter 14.
February 3. Lab: the make compilation manager.
Reading: Aho et al., sections 2.6 and 2.7 (pages 76-91).
February 5. An overview of lexical analysis.
Reading: Aho et al., chapter 2, from section 2.8 to the end
(pages 91-107).
February 8. An overview of intermediate code generation.
February 10. Lab: the git version-control system.
February 12. The term project; overview of Dijkstra's notation for
algorithms.
February 15. Examples of Dijkstra's notation.
Reading: Aho et al., chapter 3 through section 3.3 (pages
109-128).
February 17. Tokens; input buffering.
Reading: Aho et al., sections 3.4 through 3.6 (pages 128-152).
February 19. Finite automata; overview of the lex scanner
generator.
Reading: Aho et al., sections 3.7 and 3.8 (pages 152-173).
February 22. The mechanics of scanner generators.
Reading: The flex manual.
February 24 and 26. Lab: the flex scanner generator.
Reading: Aho et al., chapter 3, from section 3.9 to the end
(pages 173-190).
March 1. Optimizing pattern-matching finite automata.
Reading: Aho et al., chapter 4 through section 4.4 (pages
191-233).
March 3. Context-free grammars; parsing by recursive descent.
March 5. LL parsing.
Reading: Aho et al., section 4.5 (pages 233-241).
March 8. Bottom-up parsing strategies.
Reading: Aho et al., section 4.6 (pages 241-259).
March 10. Simple LR parsing.
Reading: Aho et al., section 4.7 (pages 259-278).
March 12. Efficient LR parsing; constructing and storing LR parsing
tables.
Reading: Aho et al., section 4.8 (pages 278-287).
March 15. Resolving ambiguities; recovering from errors.
Reading: Aho et al., chapter 4, from section 4.9 to the end
(pages 287-302).
March 17. Lab: the bison parser generator.
Reading: The GNU bison manual.
March 19. Lab: the bison parser generator (continued).
Reading: Aho et al., chapter 5, through section 5.2 (pages
303-317).
April 5. Syntax-directed definitions; computing attributes.
Reading: Aho et al., sections 5.3 and 5.4 (pages 318-337).
April 7. Syntax-directed translation schemes.
Reading: Aho et al., chapter 5, from section 5.5 to the end
(pages 337-355).
April 9. Implementing syntax-directed translation schemes in
recursive-descent, LL, and LR parsers.
Reading: Aho et al., chapter 6 through section 6.4 (pages
357-386).
April 12. Three-address code and the translation of expressions.
Reading: Aho et al., section 6.5 (pages 386-399).
April 14. Type checking; unification.
Reading: Aho et al., chapter 6, from section 6.6 to the end
(pages 399-426).
April 16 and 19. Translating control structures.
Reading: Aho et al., chapter 7 through section 7.3 (pages
427-452).
April 21. The run-time stack.
Reading: Aho et al., section 7.4 (pages 452-463).
April 23. Heap management.
April 26 and 28. Code generation.
Reading: Aho et al., section 8.4 (pages 525-532).
April 30. Basic blocks and flow graphs.
Reading: Aho et al., sections 8.5 through 8.8 (pages 533-537).
May 3. Register allocation.
Reading: Aho et al., sections 8.9 and 8.10 (pages 558-567).
May 5. Instruction selection.
Reading: Aho et al., section 8.10 (pages 567-573).
May 7. Optimal code generation for expression evaluation.
Reading: Aho et al., chapter 8, from section 8.11 to the end
(pages 573-581).
May 10. The dynamic programming algorithm for code generation.
Reading: Aho et al., chapter 7, from section 7.5 to the end
(pages 463-503).
May 12. Garbage collection strategies.
May 14. Review and commentary; student evaluations.
May 19, 9 a.m. to noon: Project review and finalization.