* 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.