Ce type d'analyseur fonctionne en regardant le symbole suivant pour décider quelle règle choisir. Par défaut, il ne regarde que le symbole suivant (lookahead = 1). Mais vous pouvez configurer l'analyseur pour qu'il regarde non seulement le suivant, mais aussi les N symboles suivants. Si vous définissez lookahead sur 2, l'analyseur généré examinera les deux symboles suivants pour décider quelle règle choisir. De cette façon, vous pouvez définir votre grammaire plus naturelle, mais au prix de la performance. Plus le lookahead est grand, plus l'analyseur devra faire.
Si vous définissez l'apparence générale sur un plus grand nombre, votre analyseur sera plus lent pour toutes les entrées (pour les grammaires non triviales). Vous pouvez utiliser lookahead localement si vous voulez laisser l'analyseur avec lookahead = 1 par défaut et utiliser un lookahead plus grand seulement dans des situations spécifiques.
http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc4.5
Par exemple, un analyseur avec 1 = préanalyse ne peut pas décider des règles (1 ou 2) de prendre, mais avec 2 = préanalyse il peut:
void rule0() : {} {
<ID> rule1()
| <ID> rule2()
}
Vous peut changer la définition de la grammaire pour obtenir le même résultat mais utiliser lookahead = 1:
void rule0() : {} {
<ID> (rule1() | rule2())
}