While I was preparing for the class, I read a paper titled "Design and Implementation of a Modern Compiler Course" where the abstract read:

Current literature states that the undergraduate curriculum can no longer afford the luxury of a traditional compiler course. Nevertheless, there is an increasing need for an understanding of how to design and implement domain-specific languages. This paper presents a modern course in compiler construction, designed to provide a student with the capability of quickly constructing robust processors for a variety of language-related applications.

The authors went on to describe their experiences presenting a compiler course from a more abstract standpoint, letting their students focus more on analysis and design than on churning out low-level code. They used the [link|http://eli-project.sourceforge.net/|Eli compiler toolkit] as their tool of choice.

I looked at Eli and decided it was a bit much to just throw at my student without some preparation. So the first half of the class used flex and bison and we discussed such elements as regular expressions, lexers, context-free grammars and parse trees. Once they were comfortable with flex and bison, I added [link|http://memphis.compilertools.net/index.html|Memphis] to build the tree-walking code.

Now that they have a handle on the theory as well as the practice, we're exploring Eli. It's a pretty nifty set of tools, with a lot of cool features. The home page has a lot of documentation and several tutorials that are quite well-written.

Anyway, I did this because our programming curriculum (unlike that of a traditional CS program) is heavy on practice and only offers enough theory to move the practice forward. Since the compiler class is a senior project class I felt that my students could benefit from a more abstract approach.