Wirth's classic recursive descent Pascal compiler in his 1976 book Algorithms + Data Structures = Programs is a basic compiler for a somewhat useful language.
That's kind of dated. What's a modern equivalent?
I ran through the first half or so of both versions earlier this year while looking for material for a colleague (and a few other books, courses, and tutorials). Overall I like the approach which is based on the nanopass compiler concept mentioned by some other commenters. You get a functioning compiler (as in it produces an executable program) very early, and then spend the rest of the book extending the language and adding passes.
The author chose TypeScript for the Compiler, which makes it somewhat more accessible to these days programmers.
Thorston Ball's Compiler and Interpreter book series is the only other book on the subject I find widely recommend and modern.