Bottom-up-Parsing beginnt von den Blattknoten des Baumes und arbeitet in Richtung nach oben, bis sie den Wurzelknoten erreicht. Hier start wir von einem Satz und wenden Sie dann den Produktionsvorschriften in umgekehrter Weise, um das Startsymbol zu erreichen. Die unten angegebenen Bild zeigt die Bottom-up-Parser zur Verfügung.
Umschalttaste reduzieren Parsen verwendet zwei einzigartige Schritte für Bottom-up-Analyse. Diese Schritte werden bekannt als Shift-Stufen und reduzieren Schritt.
Umschalt Schritt : Die Verschiebung Schritt bezieht sich auf die Weiterentwicklung der Eingabezeiger auf das nächste Eingabesymbol, die aufgerufen wird das verschoben Sinnbild. Dieses Zeichen wird auf dem Stapel abgelegt. Das verschobene Symbol ist als einen einzelnen Knoten des Parserbaums behandelt.
Reduzieren Schritt : Wenn der Parser findet eine komplette Grammatikregel (RHS) und ersetzt es zu (LHS), es ist als reduzieren Schritt bekannt. Dies geschieht, wenn das obere Ende des Stapels enthält einen Griff. Um zu reduzieren, ein POP-Funktion wird durchgeführt auf dem Stapel, welche aus Pop weg den Griff und ersetzt sie durch LHS Nicht-Terminalsymbol.
Der LR-Parser ist eine nicht-rekursive, Schicht reduzieren, Bottom-up-Parser. Es verwendet eine breite Klasse von kontextfreie Grammatik, die er der effizienteste Syntaxanalyse Technik macht. LR Parser sind auch als LR (k) Parser, worin L Stände für links-nach-rechts-Abtastung des Eingangsstroms ; R steht für die Konstruktion von äußerst rechte Ableitung in umgekehrter Richtung, und k bezeichnet die Anzahl der Symbole, um Entscheidungen zu treffen.
Es gibt drei verbreiteten AlgorithmenVerfügung für den Aufbau eines LR-Parser:
Hier beschreiben wir ein Skelett eines Algorithmus LR-Parser:
token = next_token() repeat forever s = top of stack if action[s, token] = “shift si” then PUSH token PUSH si token = next_token() else if action[s, tpken] = “reduce A::= β“ then POP 2 * |β| symbols s = top of stack PUSH A PUSH goto[s,A] else if action[s, token] = “accept” then return else error()
LL | LR |
---|---|
Tut eine Linksableitung. | tut eine Rechtsableitung in umgekehrter. |
Start mit der Wurzel Nichtterminal auf den Stapel. | Endet mit dem Root-Nichtterminal auf den Stapel. |
Endet wenn der Stapel leer ist. | Startet mit einem leeren Stack. |
Verwendet die Stapel für nende, was immer noch zu erwarten ist. | Verwendet den Stack für die Benennung, was ist bereits gesehen. |
Erstellt die Syntaxbaum von oben nach unten. | Erstellt die Parse-Baum von unten nach oben. |
Kontinuierlich pops ein Nichtterminal ausgeschaltet die Stapel, und drückt den entsprechenden rechten Seite. | Versucht eine rechte Seite auf dem Stack zu erkennen, pops es, und schiebt den entsprechenden Non-Terminal. |
Erweitert die nicht-Terminals. | Reduziert die nicht-Terminals. |
Liest die Klemmen, wenn es pops eine ausgeschaltet Stapel. | Liest die Klemmen während es schiebt sie auf die Stapel. |
Pre-order Traversierung des Parse-Baum. | Post-Order Traversierung der Parse-Baum. |