writing the parser by hand lol