parser and most of a compiler