C Compiler from Scratch
IMHO, you shouldn't write a compiler 'from scratch". You should write it using lots of libraries offering supporting functionality, such as:* Grammar-based parsing* Tree and graph representation, traversing* (Possibly) A tree or graph grammar library* Cross-platform filesystem support* Combinatorial algorithm implementations (some of them may get used in various optimizers)* terminal support (for formatted output)and so on. And of course - there's the standard (C) library which one should also not count as "scratch".Now, as an exercise, it is not-uninteresting to also implement parts of some of those, but it's not clear that "from scratch" is the most pedagogically-useful approach.