Crafting a parser, part 3: designing the AST

Enums all the way down, spans on every node, and keeping semantics out of the syntax tree.