I personally love the book „Engineering a Compiler“ by Cooper & Torczon. Its got the perfect mix of theory and practice and helped me a lot understanding the whole subject. No prser generators and dependencies is a huge bonus too, the first chapters quickly get you up to speed with lexing and various methods of parsing.
<p><pre><code> First off, real world languages generally don't use parser generators. Parser generators are also harder to learn, and are another dependency and build step. So you can happily skip.
</code></pre>
Parsers are fun to write maybe once or twice but honestly one of the least exciting and most time consuming things to write. Use a parser generator if you can!