JavaCC crea analizadores de descenso recursivos. Este tipo de analizador funciona mirando el siguiente símbolo para decidir qué regla elegir. Por defecto, solo mira el siguiente símbolo (lookahead = 1). Pero puede configurar el analizador para que observe no solo el siguiente, sino también los próximos N símbolos. Si establece la búsqueda anticipada en 2, el analizador generado verá los siguientes dos símbolos para decidir qué regla elegir. De esta forma, puedes definir tu gramática más natural, pero a costa del rendimiento. Cuanto mayor sea la anticipación, más tendrá que hacer el analizador sintáctico.
Si configura el lookahead general a un número mayor, su analizador será más lento para todas las entradas (para gramáticas no triviales). Puede utilizar el análisis anticipado localmente si desea dejar que el analizador con anticipación = 1 de forma predeterminada y utilizar una búsqueda anticipada más grande solo en situaciones específicas.
http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc4.5
Por ejemplo, un analizador de búsqueda hacia delante = 1 no puede decidir cuál de las reglas (1 o 2) a tomar, pero con lookahead = 2 se puede:
void rule0() : {} {
<ID> rule1()
| <ID> rule2()
}
Usted puede cambiar la definición de la gramática para obtener el mismo resultado pero use lookahead = 1:
void rule0() : {} {
<ID> (rule1() | rule2())
}