You can hardly search the internet for compiler books without seeing the "Dragon Book" rear its head. Intrigued by its reputation as the authority (not to mention being very hard to read,) I had to buy it.
This book is very theoretical! That may be good or bad, depending on how used you are to handling theory. It is well organized. The authors break the compiler into front end and back end, and then further into symbol table, lexer, parser, semantics, intermediate code generation, code generation, and code optimization. There are chapters dedicated to each.
I didn't read the whole book (so I'm still a mere mortal,) only the recommended introductory sections followed by some browsing. This was out of personal interest - not for a class. By the time I was through chapter 7 or so, I sat down and started planning a [cheesy] Pascal compiler (they give the grammar as a project.) I'm not done yet - heh - but I haven't been frustrated by anything the book hasn't covered yet. Therefore, I can testify that this book has really guided me well.
However, like I said, if you space out in the presence of pure crystalline theory, then this book is not for you. Usually the first 3 sections of a chapter are 100% theory, then the "how to" section, followed by advanced theory. It may help if you have taken some courses in abstract algebras - I'm not kidding! Also, a (the) major flaw this book has is the mysteriously missing pages of code. There is no complete compiler (of anything significant) to study (which is why it gets 4 instead of 5 stars.) The only thing close is a 5 page infix to postfix translator written in archaic C. This book gives you the tools, not the answers. Be warned.
Still, I recommend it to the dauntless and couragous... dragon slayers. [Hack-snort]