As a matter of fact you do. You could leave out the lexer and directly parse the language, without converting it to a token stream first, but that would make the parser much more complicated, afaik. Also, ANTLR generates all that stuff for you, which you can then invoke directly from Java.