This is intended to give you a sense of what I think is important from the course so far, and what I will be thinking of when creating the exam. I hate disclaimers, but here are some anyway. This is not a contract. I may have inadvertently left something off this list that ends up in an exam question. I make no guarantees that the exam will be 100% limited to items listed below. Moreover, I will not be able to test all of this material given the time limitations of the exam. I will have to pick and choose some subset of it. You are permitted one 8.5 x 11 sheet of paper with notes (both sides) for use as a reference during the exam. Here are the specifics: Students should be able to... Be able to write Scheme functions on paper to do specified tasks. Specifically, students should be able to successfully make significant use of recursion. Lazy lists in particular are a more abstract idea beyond straightforward programming that students should be able to use and code as well. Any Scheme code should be written in a purely functional style (no side effects). Be able to distinguish between an assembler, a compiler, and an interpreter, describe how each works in "classic" simple scenarios as well as in "hybrid" modern scenarios (such as with Java and Python), and reason about tradeoffs between them and ramifications of using one vs. another. Be able to motivate what purpose BNF serves. Be able to precisely produce BNF to describe a language that I describe in words and/or examples, as well as use derivations in order to show if a particular "sentence" is valid in a particular language. Be able to produce parse trees, and be able to demonstrate whether or not a particular grammar is ambiguous. Be able to discuss the merits of different parse trees that describe the same sentence from the perspective of which is more desirable for a compiler to work with. Be able to explain what a scanner is, what lexemes are, what tokens are, and what role a scanner plays in compiler development. Be able to explain what a parser is, what it does, and what role a parser plays in compiler development. Be able to explain what an LL(1) grammar is. For a particular grammar, be able to determine whether or not it is LL(1).