"Let's build a compiler" was already suggested. There is a "modernized" version using Haskell instead of Turbo Pascal: http://alephnullplex.appspot.com/blog/view/2010/01/12/lbach-1-introduction
Keeping with Haskell, there is a very instructive Scheme interpreter which could give further ideas: Write Yourself a Scheme in 48 Hours