This book presents the subject of Compiler Design in a way that's understandable to a programmer, rather than a mathematician. Our basic premise is that the best way to learn how to write a compiler is to look at one in depth; the best way to understand the theory is to build tools that use that theory for practical ends. So, this book is built around working code that provides immediate practical examples of how given theories are applied. We make no claims that the code presented here is the only (or the best) implementation of the concepts presented. We've found, however, that looking at an implementation-at any implementation--can be a very useful adjunct to understanding the theory, and the reader is well able to adapt the concepts presented here to alternate implementations.