reorganizing preprocessor into separate lexer/parser