<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=LR-Parser</id>
	<title>LR-Parser - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=LR-Parser"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=LR-Parser&amp;action=history"/>
	<updated>2026-05-22T20:31:25Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=LR-Parser&amp;diff=368336&amp;oldid=prev</id>
		<title>~2025-38216-33: Link hat sich geaendert</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=LR-Parser&amp;diff=368336&amp;oldid=prev"/>
		<updated>2025-12-03T15:37:13Z</updated>

		<summary type="html">&lt;p&gt;Link hat sich geaendert&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Im [[Compilerbau]] ist ein &amp;#039;&amp;#039;&amp;#039;LR-Parser&amp;#039;&amp;#039;&amp;#039; ein [[Bottom-up-Parser]] für [[LR(k)-Grammatik|LR-Grammatiken]]. Bei diesen [[Kontextfreie Grammatik|kontextfreien Grammatiken]] wird die Eingabe von &amp;#039;&amp;#039;&amp;#039;l&amp;#039;&amp;#039;&amp;#039;inks nach rechts abgearbeitet, um die [[Rechtsreduktion|&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;echtsreduktion]] zum Startsymbol zu berechnen.&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Ein LR-Parser heißt &amp;#039;&amp;#039;LR(k)-Parser&amp;#039;&amp;#039;, wenn er während des Parsens &amp;#039;&amp;#039;k&amp;#039;&amp;#039; [[Token (Compilerbau)|Tokens]] für eine natürliche Zahl &amp;#039;&amp;#039;k&amp;#039;&amp;#039; vorausschauen kann. &amp;#039;&amp;#039;k&amp;#039;&amp;#039; wird dabei als [[Lookahead]] bezeichnet.&lt;br /&gt;
&lt;br /&gt;
LR(&amp;#039;&amp;#039;k&amp;#039;&amp;#039;) ist eine Abkürzung für Parsen von &amp;#039;&amp;#039;&amp;#039;l&amp;#039;&amp;#039;&amp;#039;inks nach rechts mit &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;echtsreduktionen, &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Symbole Lookahead.&lt;br /&gt;
&lt;br /&gt;
LR-Parser per Hand zu schreiben birgt ein großes Fehlerrisiko, weswegen hier meistens [[Parsergenerator]]en verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Aufbau und Arbeitsweise eines LR-Parsers ==&lt;br /&gt;
Ein LR-Parser enthält einen [[Kellerspeicher]] (Stack), eine Aktionstabelle und eine Goto-Tabelle.&lt;br /&gt;
Das oberste Element im Keller gibt immer den aktuellen Zustand des Parsers an. Bei Programmstart liegt nur der Startzustand im Keller.&lt;br /&gt;
In der Aktionstabelle wird vermerkt, was bei jeder Kombination aus Zustand und Eingabezeichen zu tun ist. Mögliche Aktionen sind:&lt;br /&gt;
* &amp;#039;&amp;#039;Shift(z)&amp;#039;&amp;#039;: Bewege den Zeiger im Eingabestrom einen Schritt weiter und lege den aktuellen Zustand in den Keller. Wechsle dann in den Zustand &amp;#039;&amp;#039;z&amp;#039;&amp;#039;.&lt;br /&gt;
* &amp;#039;&amp;#039;Reduce(n)&amp;#039;&amp;#039;: Wende die Regel &amp;#039;&amp;#039;n&amp;#039;&amp;#039; an. D.&amp;amp;nbsp;h., nimm so viele Elemente aus dem Keller, wie die Regel Symbole auf der rechten Seite hat. Schaue anschließend in der Goto-Tabelle nach, welches der nächste Zustand ist, und lege diesen in den Keller.&lt;br /&gt;
* &amp;#039;&amp;#039;Accept&amp;#039;&amp;#039;: Akzeptiere die Eingabe. D.&amp;amp;nbsp;h., die Eingabe ist gültig und der Parser terminiert.&lt;br /&gt;
* &amp;#039;&amp;#039;Error&amp;#039;&amp;#039;: Ist eine Zustands-Eingabe-Konstellation in der Tabelle nicht beschrieben, dann wird die Eingabe abgelehnt und der Parser terminiert.&lt;br /&gt;
&lt;br /&gt;
== Beispiel eines Parsers ==&lt;br /&gt;
Wir betrachten folgende Grammatik in [[Backus-Naur-Form|BNF]] mit Startsymbol E:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
E ::= E &amp;quot;*&amp;quot; B | E &amp;quot;+&amp;quot; B | B .&lt;br /&gt;
B ::= &amp;quot;0&amp;quot; | &amp;quot;1&amp;quot; .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Grammatik lässt sich in folgende einzelne Reduktionsregeln umwandeln:&lt;br /&gt;
# E * B ← E&lt;br /&gt;
# E + B ← E&lt;br /&gt;
# B ← E&lt;br /&gt;
# 0 ← B&lt;br /&gt;
# 1 ← B&lt;br /&gt;
&lt;br /&gt;
Markiert man das Ende der Eingabe mit einem $-Zeichen (Regel E $ ← S; S ist neues Startsymbol), so sehen die Aktions- und Goto-Tabelle für einen LR(0)-Parser dazu folgendermaßen aus:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;margin-left:1em&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
!colspan=&amp;quot;5&amp;quot;| Aktion&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| GoTo&lt;br /&gt;
|-&lt;br /&gt;
!Zustand&lt;br /&gt;
!*&lt;br /&gt;
!+&lt;br /&gt;
!0&lt;br /&gt;
!1&lt;br /&gt;
!$&lt;br /&gt;
!E&lt;br /&gt;
!B&lt;br /&gt;
|-&lt;br /&gt;
|0||  ||  ||s1||s2||  ||3 ||4&lt;br /&gt;
|-&lt;br /&gt;
|1||r4||r4||r4||r4||r4||  ||&lt;br /&gt;
|-&lt;br /&gt;
|2||r5||r5||r5||r5||r5||  ||&lt;br /&gt;
|-&lt;br /&gt;
|3||s5||s6||  ||  ||acc|| ||&lt;br /&gt;
|-&lt;br /&gt;
|4||r3||r3||r3||r3||r3||  ||&lt;br /&gt;
|-&lt;br /&gt;
|5||  ||  ||s1||s2||  ||  ||7&lt;br /&gt;
|-&lt;br /&gt;
|6||  ||  ||s1||s2||  ||  ||8&lt;br /&gt;
|-&lt;br /&gt;
|7||r1||r1||r1||r1||r1||  ||&lt;br /&gt;
|-&lt;br /&gt;
|8||r2||r2||r2||r2||r2||  ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wie man diese Tabellen aus der Grammatik erstellt, wird im Abschnitt [[#Erstellen der Aktions- und Goto-Tabelle|Erstellen der Aktions- und Goto-Tabelle]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Beispiel eines Parse-Vorgangs ==&lt;br /&gt;
Als Eingabe sei die Zeichenkette „1+1“ gegeben.&lt;br /&gt;
&lt;br /&gt;
1. Der Startzustand ist hier 0, also startet der Parser nur mit einer 0 im Keller, und der Lesezeiger steht auf dem ersten Zeichen der Eingabe.&lt;br /&gt;
: Ausgabe: 1+1$&lt;br /&gt;
{| style=&amp;quot;margin-left:3em&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Keller:||0&lt;br /&gt;
|-&lt;br /&gt;
|Eingabe:|| ||&amp;lt;u&amp;gt;1&amp;lt;/u&amp;gt;||+||1||$&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
2. Wir schauen nun in der Aktionstabelle, was beim Zustand 0 und der Eingabe „1“ zu tun ist: s2, d.&amp;amp;nbsp;h., wir legen den Zustand 2 in den Keller und lesen das nächste Zeichen.&lt;br /&gt;
: Aktion: Lege 2 in den Keller&lt;br /&gt;
: Ausgabe: 1+1$&lt;br /&gt;
{| style=&amp;quot;margin-left:3em&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Keller:||0||2&lt;br /&gt;
|-&lt;br /&gt;
|Eingabe:|| ||1||&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;||1||$&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
3. Mit der Eingabe „+“ sollen wir im Zustand 2 Regel 5 anwenden. Die Regel 5 hat ein Element auf der rechten Seite. Daher nehmen wir ein Element aus dem Keller und sehen in der Goto-Tabelle den nächsten Zustand nach. Im Zustand 0 (die 2 haben wir ja gerade weggenommen) wird nach Anwendung einer Regel, auf deren linker Seite ein B steht, in den Zustand 4 gewechselt.&lt;br /&gt;
: Aktion: Reduziere &amp;lt;math&amp;gt;1\leftarrow B&amp;lt;/math&amp;gt;&lt;br /&gt;
: Ausgabe: &amp;lt;math&amp;gt;1+1\$ \Leftarrow_r B+1\$&amp;lt;/math&amp;gt;&lt;br /&gt;
{| style=&amp;quot;margin-left:3em&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Keller:||0||4&lt;br /&gt;
|-&lt;br /&gt;
|Eingabe:|| ||B||&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;||1||$&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
4. Jetzt kommt erneut eine Reduktion. Diesmal mit Regel 3. Wir wechseln in den Zustand 3.&lt;br /&gt;
: Aktion: Reduziere &amp;lt;math&amp;gt;B\leftarrow E&amp;lt;/math&amp;gt;&lt;br /&gt;
: Ausgabe: &amp;lt;math&amp;gt;1+1\$ \Leftarrow_r B+1\$ \Leftarrow_r E+1\$&amp;lt;/math&amp;gt;&lt;br /&gt;
{| style=&amp;quot;margin-left:3em&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Keller:||0||3&lt;br /&gt;
|-&lt;br /&gt;
|Eingabe:|| ||E||&amp;lt;u&amp;gt;+&amp;lt;/u&amp;gt;||1||$&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
5. Jetzt kommt ein Shift. Wir wechseln in den Zustand 6.&lt;br /&gt;
: Aktion: Lege + in den Keller.&lt;br /&gt;
: Ausgabe: &amp;lt;math&amp;gt;1+1\$ \Leftarrow_r B+1\$ \Leftarrow_r E+1\$&amp;lt;/math&amp;gt;&lt;br /&gt;
{| style=&amp;quot;margin-left:3em&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Keller:||0||3||6&lt;br /&gt;
|-&lt;br /&gt;
|Eingabe:|| ||E||+||&amp;lt;u&amp;gt;1&amp;lt;/u&amp;gt;||$&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
6. Shift, neuer Zustand: 2&lt;br /&gt;
: Aktion: Lege 1 in den Keller.&lt;br /&gt;
: Ausgabe: &amp;lt;math&amp;gt;1+1\$ \Leftarrow_r B+1\$ \Leftarrow_r E+1\$&amp;lt;/math&amp;gt;&lt;br /&gt;
{| style=&amp;quot;margin-left:3em&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Keller:||0||3||6||2&lt;br /&gt;
|-&lt;br /&gt;
|Eingabe:|| ||E||+||1||&amp;lt;u&amp;gt;$&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
7. Reduktion mit Regel 5, neuer Zustand ist 8&lt;br /&gt;
: Aktion: Reduziere &amp;lt;math&amp;gt;1 \leftarrow B&amp;lt;/math&amp;gt;.&lt;br /&gt;
: Ausgabe: &amp;lt;math&amp;gt;1+1\$ \Leftarrow_r B+1\$ \Leftarrow_r E+1\$\Leftarrow_r E+B\$&amp;lt;/math&amp;gt;&lt;br /&gt;
{| style=&amp;quot;margin-left:3em&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Keller:||0||3||6||8&lt;br /&gt;
|-&lt;br /&gt;
|Eingabe:|| ||E||+||B||&amp;lt;u&amp;gt;$&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
8. Reduktion mit Regel 2. Wir nehmen daher drei Elemente aus dem Keller. Dann liegt die 0 ganz oben, und wir wechseln in den Zustand 3, da die Regel 2 ein E auf der linken Seite hat.&lt;br /&gt;
: Aktion: Reduziere &amp;lt;math&amp;gt;E + B \leftarrow E&amp;lt;/math&amp;gt;.&lt;br /&gt;
: Ausgabe: &amp;lt;math&amp;gt;1+1\$ \Leftarrow_r B+1\$ \Leftarrow_r E+1\$\Leftarrow_r E+B\$ \Leftarrow_r E\$&amp;lt;/math&amp;gt;&lt;br /&gt;
{| style=&amp;quot;margin-left:3em&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|Keller:||0||3&lt;br /&gt;
|-&lt;br /&gt;
|Eingabe:|| ||E||&amp;lt;u&amp;gt;$&amp;lt;/u&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
9. Accept. Die Eingabe gehört zur Grammatik und wir sind fertig.&lt;br /&gt;
&lt;br /&gt;
== Erstellen der Aktions- und Goto-Tabelle ==&lt;br /&gt;
Um die Tabelle zu erhalten, wird aus der Grammatik ein [[deterministischer endlicher Automat]] (DEA) erstellt und dessen Zustände und Übergänge werden in die Tabelle geschrieben. Je nachdem, welche Art von LR-Parser konstruiert wird, gibt es leichte Änderungen des Konstruktionsablaufs. Ein solcher Ablauf wird zum Beispiel für [[SLR-Parser]] beschrieben.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[LL-Parser]]&lt;br /&gt;
* [[LALR-Parser]]&lt;br /&gt;
&lt;br /&gt;
== Weblink ==&lt;br /&gt;
* [http://amor.cms.hu-berlin.de/~kunert/papers/lr-analyse/ LR(k)-Analyse für Pragmatiker], ausführliche Beschreibung der LR-Analyse und der entsprechenden Unterformen (LR(0), SLR(1), LALR(1), LR(1)).&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Compilerbau|LRParser]]&lt;/div&gt;</summary>
		<author><name>~2025-38216-33</name></author>
	</entry>
</feed>