Javacc-Parseroption LOOKAHEAD, Java

8

Ich habe vor kurzem begonnen, mit grammatischen Analysatoren mit javacc herumzuspielen und eines der Felder ist die Option eins ... Ich habe einen Code wie den folgenden:

%Vor%

Was genau bedeutet die LOOKAHEAD-Option? Danke

    
out_sider 20.02.2010, 16:46
quelle

3 Antworten

8

JavaCC erstellt rekursive Abstiegsparser. 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.

Ссылка

Zum Beispiel kann ein Parser mit Lookahead = 1 nicht entscheiden, welche der Regeln (1 oder 2) zu übernehmen ist, aber mit Lookahead = 2 kann er:

%Vor%

Sie können die Definition der Grammatik ändern, um das gleiche Ergebnis zu erhalten, aber verwenden Sie lookahead = 1:

%Vor%     
Arne 20.02.2010 16:59
quelle
7

Siehe Ссылка

Normalerweise betrachtet der Parser nur das nächste Token, um zu bestimmen, welche Produktionsregel angewendet werden soll. In einigen Fällen reicht dies jedoch nicht aus, um die Wahl zu treffen. Zum Beispiel, zwei Produktionsregeln gegeben:

%Vor%

Wenn das nächste Token vom Typ identifier ist, kann der Parser nicht feststellen, ob es die Produktion foo oder bar verwenden soll. JavaCC gibt dann einen Fehler aus und sagt, dass es mehr Look-Ahead benötigt. Wenn das Look-Ahead auf 2 geändert wird, kann der Parser die nächsten zwei Token betrachten, was in diesem Fall ausreicht, um zwischen den Produktionen zu wählen.

Wie Steve darauf hingewiesen hat, ist dies in den javacc-Dokumenten: Ссылка

    
Hans W 20.02.2010 16:57
quelle
2

Der LOOKAHEAD-Wert teilt dem generierten Parser mit, wie viele nicht verarbeitete (d. h. zukünftige) Token verwendet werden, um zu entscheiden, in welchen Zustand er übergeht. In einer stark eingeschränkten Sprache ist nur ein Lookahead-Token erforderlich. Je mehrdeutige eine Sprache ist, desto mehr Lookahead-Token werden benötigt, um zu bestimmen, welcher Zustandsübergang vorgenommen werden soll.

Ich denke, das ist im javacc (1) Tutorial behandelt.

    
Steve Emmerson 20.02.2010 16:59
quelle

Tags und Links