write lexer parser compiler