JavaCC erstellt rekursive Sink-Parser. Diese Art von Parser arbeitet mit dem nächsten Symbol, um zu entscheiden, welche Regel ausgewählt werden soll. Standardmäßig wird nur das nächste Symbol (Lookahead = 1) betrachtet. Aber Sie können den Parser so konfigurieren, dass er nicht nur auf die nächsten, sondern auch auf die nächsten N Symbole schaut. Wenn Sie Lookahead auf 2 setzen, sucht der generierte Parser nach den nächsten beiden Symbolen, um zu entscheiden, welche Regel ausgewählt werden soll. Auf diese Weise können Sie Ihre Grammatik natürlicher definieren, jedoch auf Kosten der Leistung. Je größer der Lookahead, desto mehr muss der Parser tun.
Wenn Sie den allgemeinen Lookahead auf eine größere Zahl setzen, wird Ihr Parser für alle Eingaben langsamer (für nicht triviale Grammatiken). Sie können Lookahead lokal verwenden, wenn Sie den Parser mit Lookahead = 1 standardmäßig verwenden und nur in bestimmten Situationen einen größeren Lookahead verwenden möchten.
http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc4.5
Zum Beispiel kann ein Parser mit Look-Ahead = 1 kann nicht, welche der Regeln entscheiden (1 oder 2) zu nehmen, aber mit Look-Ahead = 2 kann es:
void rule0() : {} {
<ID> rule1()
| <ID> rule2()
}
Sie kann die Definition der Grammatik ändern, um das gleiche Ergebnis zu erhalten, aber verwenden Sie Lookahead = 1:
void rule0() : {} {
<ID> (rule1() | rule2())
}