break the parser, compiler, and engine into separate modules