Einfacher LR parser

In der Informatik, einem einfachen LR oder SLR ist parser ein LR parser, der einen folgen Satz verwendet, um Konflikte von seinem Handlungstisch zu entfernen. Es hat weniger Konfliktstaaten als ein LR (0) Parser, aber wird normalerweise mehr Konfliktstaaten haben als ein LALR parser. Für wirkliche Computersprachen ist ein SLR parser gewöhnlich nicht entsprechend, aber für Studentenprojekte in einer Bearbeiter-Klasse ist es ein gutes Lernwerkzeug.

Eine Grammatik, die keine Konflikte hat, die durch einen SLR parser Generator berichtet sind, ist eine SLR Grammatik.

Algorithmus

Der Syntaxanalyse-Algorithmus für einen SLR parser ist dasselbe bezüglich eines LR parser; der einzige Unterschied zwischen den zwei ist, wie ihre Handlungstische gebaut werden.

Beispiel

Eine Grammatik, die durch einen SLR parser, aber nicht durch einen LR (0) parser grammatisch analysiert werden kann, ist der folgende:

: (0) S  E

: (1) E  1 E

: (2) E  1

Wenn er

die Handlung und den goto Tisch baut, wie für LR (0) getan wird, würde parsers die folgenden Artikel-Sätze und Tische geben:

: Artikel hat 0 gesetzt

: S  · E

: + E  · 1 E

: + E  · 1

: Artikel hat 1 gesetzt

: E  1 · E

: E  1

·: + E  · 1 E: + E  · 1

: Artikel hat 2 gesetzt

: S  E

·

: Artikel hat 3 gesetzt

: E  1 E

·

Die Handlung und goto Tische:

</tr></tr></tr></tr></tr></tr></Tisch>

Wie beobachtet werden kann, gibt es einen Shift-Reduce-Konflikt für staatlichen 1 und Terminal '1'. Das kommt vor, weil, wenn der Handlungstisch für einen LR parser geschaffen wird, abnehmen, werden Handlungen auf einer Basis pro Reihe eingefügt. Jedoch, indem Sie einen folgen Satz verwenden, nehmen Sie ab Handlungen können mit der feineren Körnung hinzugefügt werden. Der folgen Satz für diese Grammatik:

</tr>

</tr></Tisch>

Ein Reduzieren muss nur zu einer besonderen Handlungssäule hinzugefügt werden, wenn diese Handlung im folgen damit vereinigten Satz ist, nehmen ab. Dieser Algorithmus beschreibt, ob eine reduzieren Handlung zu einer Handlungssäule hinzugefügt werden muss:

fungieren Sie mustBeAdded (reduceAction, Handlung) {\

ruleNumber = reduceAction.value;

ruleSymbol = Regeln [ruleNumber].leftHandSide;

wenn (Handlung in followSet (ruleSymbol)) {\

kehren Sie wahr zurück;

}\

sonst {\

kehren Sie falsch zurück;

}\

}\

zum Beispiel, mustBeAdded (r2, "1") ist falsch, weil die linke Seite der Regel 2 "E" ist, und 1 nicht in E ist, folgen Satz.

Im Gegenteil, mustBeAdded (r2, "$") ist wahr, weil "$" in E ist, folgen Satz.

Durch das Verwenden mustBeAdded auf jedem reduzieren Handlung im Handlungstisch, das Ergebnis ist ein konfliktfreier Handlungstisch:

</tr></tr></tr></tr></tr></tr></Tisch>

Siehe auch


Nationale Gewehr-Vereinigung / Athen, Ohio
Impressum & Datenschutz