CS 360
Winter 2015
Programming Language Concepts
Tuesdays, Thursdays 14:00-15:20
University Crossings 151

Geoffrey Mainland
University Crossings 106
Teaching Assistant:
Brian Lee
Warning! This material is for an old version of the course.

The final will cover material from the entire course. However, the midterm covered material up to but not including Haskell (the second lecture of week 5), so you can expect that the final exam will focus on material not covered by the midterm.

You may be asked to write some small functions in Scheme and/or Haskell. You will not lose points for minor syntactic errors.

You may bring a single, hand-written, two-sided, 8.5” x 11” sheet of notes to the exam. This sheet must have your name on it, and it will be collected with your exam.

The midterm study guide accurately describes what you need to know from the first half of the course for the final exam. Additionally, I suggest you focus on the following aspects of the second half of the course.

  1. Lambda calculus. Know the syntactic structure of the lambda calculus and understand how to evaluate lambda calculus terms. Understand the different ways in which one could define an operational semantics for the lambda calculus.

  2. Nondeterministic Finite Automata. Understand how to simulate an NFA and know how to convert a regular expression into an NFA.

  3. Know what it means for a value to be a fixed point of a function.

  4. Denotational semantics. Understand how to construct and use a denotational semantics for a simple language.

  5. Operational semantics. Understand how to construct and use an operational semantics for a simple language.

  6. Axiomatic semantics. Understand how to define soundness and completeness of a logical system. These are properties of a logical system relative to a semantics.

  7. Monads. Understand the monad abstraction and how return and (>>=) (“bind”) work.

  8. Understand the difference between lexing and parsing. Understand why regular expressions are used for lexing and context-free grammars are used for parsing.

  9. Understand why CFGs are more powerful than regular expressions.

  10. Understand how to eliminate left recursion in a grammar and how to left factor a grammar.

  11. Understand First, Follow, and Nullable.

  12. Be able to write a simple recursive-descent parser.