wip: switch to handcrafted lexer + parser