factored out lexer grammar for simplicity