<?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=Earley-Algorithmus</id>
	<title>Earley-Algorithmus - 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=Earley-Algorithmus"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Earley-Algorithmus&amp;action=history"/>
	<updated>2026-05-26T00:12:09Z</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=Earley-Algorithmus&amp;diff=416295&amp;oldid=prev</id>
		<title>imported&gt;Invisigoth67: typo</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Earley-Algorithmus&amp;diff=416295&amp;oldid=prev"/>
		<updated>2024-09-20T14:37:12Z</updated>

		<summary type="html">&lt;p&gt;typo&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;Earley-Algorithmus&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;Earley-Parser&amp;#039;&amp;#039;&amp;#039; ist in der [[Informatik]] ein [[Algorithmus]], der [[Entscheidbar|entscheidet]], ob ein Wort von einer [[Kontextfreie Grammatik|kontextfreien Grammatik]] erzeugt werden kann. Er wurde 1970 von [[Jay Earley]] entwickelt.&lt;br /&gt;
Er ähnelt dem [[Cocke-Younger-Kasami-Algorithmus]] und löst wie dieser das [[Wortproblem (Berechenbarkeitstheorie)|Wortproblem]] der [[Kontextfreie Sprache|kontextfreien Sprachen]]. Er verwendet die Methode der [[Dynamische Programmierung|dynamischen Programmierung]].&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Eine Aufgabe eines [[Compiler]]s oder [[Parser]]s ist es, zu überprüfen, ob der eingegebene Quelltext den Regeln der entsprechenden Grammatik folgt, also der [[Syntax]] der [[Programmiersprache]] entspricht. Dies entspricht dem Lösen des Wortproblems. Da die meisten Programmiersprachen [[Kontextsensitive Sprache|kontextsensitiv]] sind, werden dabei bestimmte Bedingungen zunächst ignoriert. Dadurch kann man erreichen, dass nur das wesentlich einfachere (nicht [[NP-Vollständigkeit|NP-vollständige]]) Wortproblem der kontextfreien Sprachen gelöst werden muss. Die [[Kontextsensitive Nebenbedingung|kontextsensitiven Nebenbedingungen]], wie etwa die Vollständigkeit der [[Variablendeklaration]]en, müssen dann mit einem anderen Algorithmus geprüft werden.&lt;br /&gt;
So wird der erste Schritt der Syntaxprüfung auf das Wortproblem der kontextfreien Sprachen zurückgeführt. Diese wird vom Earley-Algorithmus und auch vom CYK-Algorithmus mit [[Landau-Symbole|&amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;]]-[[Komplexitätstheorie|Zeitaufwand]] erreicht, bei eindeutigen Grammatiken mit &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; und in manchen speziellen Grammatiken mit &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;. Beide sind optimal, um das Problem für eine allgemeine kontextfreie Sprache zu lösen. Der Earley-Algorithmus hat jedoch den Vorteil, dass keine Umwandlung der Grammatik in [[Chomsky-Normalform]] nötig ist. Nachteil ist die Einschränkung auf [[Leeres Wort|Epsilon]]-freie Grammatiken. Epsilon-Regeln können jedoch immer durch Umformung der Grammatik eliminiert werden.&lt;br /&gt;
&lt;br /&gt;
In der [[Praktische Informatik|Praxis]] versucht man meist, den relativ hohen Rechenaufwand der beiden Algorithmen zu vermeiden oder zu reduzieren. Man optimiert dabei den Compiler oder Parser speziell an die verwendete Programmiersprache und kann so oft einen geringeren Berechnungsaufwand erreichen. Besonders große Verbesserungen können dabei erreicht werden, wenn man die Syntax der Programmiersprache so weit einschränkt, dass sie [[LR(k)-Grammatik|LR1]]- oder sogar [[LL(k)-Grammatik|LL1]]-Eigenschaften hat. Dies wird bei der Entwicklung neuerer Programmiersprachen berücksichtigt. Für solche Programmiersprachen existieren Algorithmen, die in der Praxis schneller sind und weniger Speicher benötigen als der Earley-Parser. Für generelle kontextfreie Grammatiken sind der Earley-Parser und verwandte Algorithmen dagegen anderen überlegen.&lt;br /&gt;
&lt;br /&gt;
== Algorithmus ==&lt;br /&gt;
Der Algorithmus benötigt als [[Eingabe (Computer)|Eingabe]] eine kontextfreie Grammatik und ein Wort über demselben [[Alphabet]]. Er entscheidet dann, ob die Grammatik das Wort erzeugen kann.&lt;br /&gt;
Dabei geht er nicht wie der CYK-Algorithmus &amp;#039;&amp;#039;rückwärts&amp;#039;&amp;#039; wieder zum Startsymbol der Grammatik, sondern versucht das Wort zeichenweise zu erzeugen.&lt;br /&gt;
In jedem Berechnungsschritt versucht er also, ein Zeichen des Wortes weiter zu kommen, bis das ganze Wort erzeugt ist. In einem solchen Fall ist das Wort von der Grammatik erzeugbar. Falls das Wort nicht erzeugbar (also nicht in der Sprache enthalten) ist, bricht der Algorithmus ab, da er an einem Zeichen ankommt, das er nicht vorhersagen kann.&lt;br /&gt;
Bei der Eingabe eines Wortes &amp;lt;math&amp;gt;x_1 x_2 \dots x_n&amp;lt;/math&amp;gt; verwendet der Algorithmus die Zustandsmengen &amp;lt;math&amp;gt;Q_0, \dots, Q_n&amp;lt;/math&amp;gt;. Ein Zustand (oder &amp;#039;&amp;#039;Earley-Zustand&amp;#039;&amp;#039;, engl. {{lang|en|Earley item}}, auch {{lang|en|dottet rule}}) des Algorithmus ist dabei eine [[Produktionsregel|Produktion]], deren rechte Seite durch einen Teilungspunkt &amp;lt;math&amp;gt;\bullet&amp;lt;/math&amp;gt; zerlegt ist. Alle Zeichen vor diesem Punkt gelten als schon überprüft. Ein solcher Zustand &amp;lt;math&amp;gt;(A \rightarrow \ldots \bullet \ldots , i)&amp;lt;/math&amp;gt; ist in einer Zustandsmenge &amp;lt;math&amp;gt;Q_j&amp;lt;/math&amp;gt; enthalten und durch einen zusätzlichen Zähler &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; gekennzeichnet. Dieser bestimmt, aus welcher Menge der Zustand ursprünglich stammt, damit der Algorithmus später mit Rekonstruktionschritten schnell einen [[Syntaxbaum]] erzeugen kann.&lt;br /&gt;
&lt;br /&gt;
Am Anfang wird &amp;lt;math&amp;gt;(S&amp;#039;\rightarrow\bullet S,0) \in Q_0&amp;lt;/math&amp;gt; gesetzt. Dabei ist &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; das Startsymbol der Grammatik. Der Algorithmus läuft nun Zeichen für Zeichen und wendet im &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; ten Schritt immer die drei folgenden Regeln an, solange bis keine weiteren Zustände mehr angefügt werden können. Dabei ist zu beachten, dass Änderungen der Zustandsmenge auch vorherige Regeln erneut zur Anwendung bringen können. Zum Beispiel muss auf Zustände, die durch den completer hinzukommen, wieder der predictor aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF; width:10em&amp;quot;| Voraussage (P)&amp;lt;br /&amp;gt;(engl. {{lang|en|predictor}})&lt;br /&gt;
|style=&amp;quot;width:50em&amp;quot;| Falls &amp;lt;math&amp;gt;(A\rightarrow \ldots \bullet B \ldots , j)&amp;lt;/math&amp;gt; in &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; enthalten ist, füge für jede Regel &amp;lt;math&amp;gt;B\rightarrow \alpha&amp;lt;/math&amp;gt; der Grammatik den Zustand &amp;lt;math&amp;gt;(B\rightarrow \bullet\alpha, i)&amp;lt;/math&amp;gt; zu &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; hinzu.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF; width:10em&amp;quot; | Überprüfung (S)&amp;lt;br /&amp;gt;(engl. {{lang|en|scanner}})&lt;br /&gt;
|style=&amp;quot;width:50em&amp;quot;| Falls &amp;lt;math&amp;gt;(A\rightarrow \ldots \bullet a \ldots , j) \in Q_i&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;a=x_{i+1}&amp;lt;/math&amp;gt;, füge &amp;lt;math&amp;gt;(A\rightarrow \ldots a\bullet \ldots , j)&amp;lt;/math&amp;gt; zu &amp;lt;math&amp;gt;Q_{i+1}&amp;lt;/math&amp;gt; hinzu.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF; width:10em&amp;quot;| Vervollständigung (C)&amp;lt;br /&amp;gt;(engl. {{lang|en|completer}})&lt;br /&gt;
|style=&amp;quot;width:50em&amp;quot;| Falls ein finaler Zustand &amp;lt;math&amp;gt;(A\rightarrow ...\bullet ,j) \in Q_i&amp;lt;/math&amp;gt; existiert, füge für alle Zustände &amp;lt;math&amp;gt;(B\rightarrow \ldots \bullet A \ldots , k) \in Q_j&amp;lt;/math&amp;gt; einen Zustand &amp;lt;math&amp;gt;(B\rightarrow \ldots A\bullet \ldots , k)&amp;lt;/math&amp;gt; zu &amp;lt;math&amp;gt;Q_i&amp;lt;/math&amp;gt; hinzu.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Man nennt die drei Schritte auch &amp;#039;&amp;#039;prädiktive Erweiterung&amp;#039;&amp;#039;, &amp;#039;&amp;#039;lexikalische Konsumption&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Konstituentenvervollständigung&amp;#039;&amp;#039;. In der Definition bedeuten Kleinbuchstaben &amp;#039;&amp;#039;terminierte Symbole&amp;#039;&amp;#039; (auch &amp;#039;&amp;#039;lexikalische Kategoriensymbole&amp;#039;&amp;#039;, engl. {{lang|en|terminals}}), Großbuchstaben &amp;#039;&amp;#039;nichtterminierte Symbole&amp;#039;&amp;#039; (auch &amp;#039;&amp;#039;komplexe syntaktische Kategoriensymbole&amp;#039;&amp;#039;, engl. {{lang|en|non-terminals}}) und griechische Buchstaben die gesamte rechte Seite einer Regel, bestehend aus verschiedenen Symbolen.&lt;br /&gt;
&lt;br /&gt;
Genau dann, wenn am Ende &amp;lt;math&amp;gt;(S&amp;#039;\rightarrow S\bullet , 0)&amp;lt;/math&amp;gt; in der Zustandsmenge &amp;lt;math&amp;gt;Q_n&amp;lt;/math&amp;gt; enthalten ist, kann die Grammatik das Wort erzeugen.&lt;br /&gt;
&lt;br /&gt;
Im Anschluss müssen die einzelnen Zustände durch einen geeigneten rekursiven Suchalgorithmus (engl. {{lang|en|walker}}) wieder miteinander verknüpft werden, um den Syntaxbaum zu erzeugen.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: einfacher mathematischer Ausdruck ===&lt;br /&gt;
Die folgende Grammatik (Anwendungsbeispiel aus &amp;lt;ref&amp;gt;J. Aycock, N. Horspool: &amp;#039;&amp;#039;Directly-Executable Earley Parsing.&amp;#039;&amp;#039; In: &amp;#039;&amp;#039;Lecture Notes in Computer Science.&amp;#039;&amp;#039; 2027, 2001, S. 229–243, [[doi:10.1007/3-540-45306-7]] ([http://www.rsdn.ru/File/73/deep-2.pdf rsdn.ru] PDF).&amp;lt;/ref&amp;gt;)&lt;br /&gt;
{|&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;math&amp;gt;S&amp;#039; \rightarrow E&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow E+T&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow E-T&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow T&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow T*F&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow T/F&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow F&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|width=&amp;quot;150&amp;quot;|&lt;br /&gt;
{|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow n&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow -F&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow +F&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow (E)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
beschreibt einfache mathematische Ausdrücke. Die Symbole stehen hier für &amp;#039;&amp;#039;start&amp;#039;&amp;#039; (&amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;), &amp;#039;&amp;#039;expression&amp;#039;&amp;#039; (&amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;), &amp;#039;&amp;#039;term&amp;#039;&amp;#039; (&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;), &amp;#039;&amp;#039;factor&amp;#039;&amp;#039; (&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;) und &amp;#039;&amp;#039;number&amp;#039;&amp;#039; (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, Platzhalter für Zahlen. Hier könnten weitere Regeln für den genauen Aufbau von Zahlen eingefügt werden). Als Beispiel soll der Ausdruck &amp;lt;math&amp;gt;n+n&amp;lt;/math&amp;gt; erkannt werden. Die nach Ablauf des Earley-Algorithmus im Speicher befindlichen Zustände sind in den Tabellen &amp;lt;math&amp;gt;Q_0&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;Q_3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;hintergrundfarbe1 rahmenfarbe1&amp;quot; cellpadding=&amp;quot;4&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border:1px solid #999999; border-collapse:collapse; margin:1em 0;&amp;quot;&lt;br /&gt;
|+ n&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EEEEEE&amp;quot;| &amp;lt;math&amp;gt;Q_0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;S&amp;#039; \rightarrow \bullet E &amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow \bullet E+T&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow \bullet E-T&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow \bullet T&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow \bullet T*F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow \bullet T/F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow \bullet F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow \bullet n&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow \bullet -F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow \bullet +F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow \bullet (E)&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;hintergrundfarbe1 rahmenfarbe1&amp;quot; cellpadding=&amp;quot;4&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border:1px solid #999999; border-collapse:collapse; margin:1em 0;&amp;quot;&lt;br /&gt;
|+ +&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EEEEEE&amp;quot;| &amp;lt;math&amp;gt;Q_1&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|S:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red}F \rightarrow n\bullet&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red},\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red}T \rightarrow F\bullet&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red},\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red}E \rightarrow T\bullet&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red},\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow T\bullet *F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow T\bullet /F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red}S&amp;#039; \rightarrow E\bullet&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow E\bullet +T&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow E\bullet -T&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;hintergrundfarbe1 rahmenfarbe1&amp;quot; cellpadding=&amp;quot;4&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border:1px solid #999999; border-collapse:collapse; margin:1em 0;&amp;quot;&lt;br /&gt;
|+ n&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EEEEEE&amp;quot;| &amp;lt;math&amp;gt;Q_2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|S:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow E+\bullet T&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow \bullet T*F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow \bullet T/F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow \bullet F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow \bullet n&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow \bullet -F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow \bullet +F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|P:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F \rightarrow \bullet (E)&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; margin-right:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;hintergrundfarbe1 rahmenfarbe1&amp;quot; cellpadding=&amp;quot;4&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border:1px solid #999999; border-collapse:collapse; margin:1em 0;&amp;quot;&lt;br /&gt;
|+ &amp;amp;nbsp;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#EEEEEE&amp;quot;| &amp;lt;math&amp;gt;Q_3&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|S:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red}F \rightarrow n\bullet&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red},\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red}T \rightarrow F\bullet&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red},\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red}E \rightarrow E+T\bullet&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red},\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow T\bullet *F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T \rightarrow T\bullet /F&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red}S&amp;#039; \rightarrow E\bullet&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;\color{Red},\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow E\bullet+T&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#CAE1FF&amp;quot;|C:&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E \rightarrow E\bullet-T&amp;lt;/math&amp;gt;&lt;br /&gt;
|&amp;lt;math&amp;gt;,\,0&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gezeigt. Sie wurden durch mehrfache Anwendung der drei Schritte &amp;#039;&amp;#039;Voraussage&amp;#039;&amp;#039; (P), &amp;#039;&amp;#039;Überprüfung&amp;#039;&amp;#039; (S) und &amp;#039;&amp;#039;Vervollständigung&amp;#039;&amp;#039; (C) erzeugt, wie gekennzeichnet. Rot markiert sind die finalen Zustände, deren Punkt das Ende der Regel erreicht hat. Bis zu dieser Stelle entspricht also der Ausdruck einer gegebenen Regel. Jedoch nur wenn, wie in diesem Beispiel, in der letzten Zustandsmenge &amp;lt;math&amp;gt;Q_3&amp;lt;/math&amp;gt; der finale Zustand der Startregel enthalten ist, wurde der gesamte Ausdruck erfolgreich erkannt und wird folglich durch die Grammatik erzeugt. Durch eine rekursive Suche kann nun, ausgehend von diesem letzten Zustand, der Pfad zurück zum Anfang zurückverfolgt und ein Syntaxbaum erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Als gesuchter Syntaxbaum zu &amp;lt;math&amp;gt;n+n&amp;lt;/math&amp;gt; ergibt sich:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;math&amp;gt;S&amp;#039;&amp;lt;/math&amp;gt; →&lt;br /&gt;
|&amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; →&lt;br /&gt;
|&amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; +&lt;br /&gt;
|&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|↓&lt;br /&gt;
|&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; →&lt;br /&gt;
|&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|↓&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; → &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; →&lt;br /&gt;
|&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; →&lt;br /&gt;
|&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; → &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Konstruktion des Syntaxbaums ==&lt;br /&gt;
&lt;br /&gt;
Für die Berechnung des Syntax-Baumes schlug J. Earley in seiner Originalarbeit 1970 eine Rückverfolgung der Zustände vor, indem jeder Zustand einen Zeiger auf den Zustand speichert, der diesen erzeugt hat. Tomita&amp;lt;ref&amp;gt;Masaru Tomita, &amp;#039;&amp;#039;Efficient parsing for natural language&amp;#039;&amp;#039;, Kluwer Academic Publishers, Boston, p. 201, 1986.&amp;lt;/ref&amp;gt; zeigte 1986, dass dieser Ansatz bei manchen mehrdeutigen Grammatiken zu falschen Syntaxbäumen führt. Um Syntaxbäume für generelle kontextfreie Grammatiken zu berechnen, muss eine rekursive Suche durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Dazu wird bei der finalen Startregel begonnen, die sich in der letzten Zustandsmenge befindet. Mit einer rekursiven Suche werden die Zustandsmengen und der Eingabe-String rückwärts durchlaufen. Dies kann wiederum mit einer Art Rückwärts-Scanner, Rückwärts-Predictor und Rückwärts-Completer realisiert werden, solange bis die anfängliche Startregel reproduziert wurde. Der Pfad zurück zum Anfang gibt den gesuchten Syntaxbaum wieder. Bei mehrdeutigen Situationen müssen rekursiv alle Möglichkeiten durchlaufen werden. Wenn bei einer mehrdeutigen Grammatik mehrere korrekte Syntaxbäume berechnet werden sollen, wird der gefundene Zustand gespeichert und die Rekursion solange fortgesetzt, bis in allen Rekursionsebenen alle Mehrdeutigkeiten abgearbeitet wurden.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird ein Algorithmus beschrieben, der nur die finalen Zustände und den Eingabe-String für die Rekursion benötigt. Nichtterminierte Zustände können vorher gelöscht werden. Es handelt sich um eine Modifikation des im Lehrbuch von D. Grune&amp;lt;ref&amp;gt;{{Literatur |Autor=Dick Grune, Ceriel J. H. Jacobs |Titel=Parsing Techniques. A Practical Guide |Auflage=1. |Verlag=Ellis Horwood |Ort=New York |Datum=1990 |ISBN=0-13-651431-6 |Kapitel=Kapitel 7.2.1.2 |Seiten=153–154 |Online=[ftp://ftp.cs.vu.nl/pub/dick/PTAPG_1st_Edition/BookBody.pdf ftp.cs.vu.nl] |Format=PDF |KBytes=1900}}&amp;lt;/ref&amp;gt; beschriebenen Algorithmus, der den Eingabe-String bei der Rekursion nicht benötigt, stattdessen auch alle nichtterminierten Zustände. Beide Algorithmen sollten prinzipiell äquivalent sein.&lt;br /&gt;
&lt;br /&gt;
[[Datei:earleytree.svg]]&lt;br /&gt;
&lt;br /&gt;
In der Abbildung entspricht die rekursive Suche einer Wanderung von rechts nach links über den Stapel aus verschachtelten Regeln. Die oberste Rekursionsebene der Suche entspricht in der Abbildung dem rechten Ende der unteren Startregel und die unterste Rekursionsebene dem linken Ende. Die Rekursionsebenen der Suche stehen also senkrecht im Bild. Der Punkt steht zunächst in allen Zuständen ganz rechts am Ende und wird während der Baumkonstruktion wieder an den Anfang zurück geschoben. Wenn der Punkt bei allen Zuständen, die Teil des Baumes sind, am Anfang steht, ist ein vollständiger Baum gefunden worden. Jeder Schritt über den Stapel hat drei Fälle:&lt;br /&gt;
&lt;br /&gt;
; Rückwärts-Predictor (Stufe nach oben): Dieser Fall tritt ein, wenn ein nichtterminiertes Symbol vor dem Punkt steht. Die noch leere Vertiefung wird mit einem passenden Zustand befüllt, der dem Symbol vor dem Punkt entspricht. Ein Zustand darf nur dann eingefügt werden, wenn zwischen den Startpositionen entweder keine Lücke verbleibt oder bei dazwischenliegenden Symbolen mindestens so viele Stellen frei bleiben, wie Symbole vorhanden sind. Andernfalls können inkorrekte Bäume entstehen. Stehen mehrere Zustände zur Auswahl, muss später zu dieser Stelle zurückgegangen und die nächste Alternative durchlaufen werden. Wurde erfolgreich ein neuer Zustand platziert, kann eine Stufe weiter nach oben gegangen werden.&lt;br /&gt;
; Rückwärts-Scanner (Schritt nach links): Dieser Fall tritt ein, wenn ein terminiertes Symbol vor dem Punkt steht. Die Übereinstimmung mit der Eingabe muss erneut geprüft werden. Bei Übereinstimmung wird der Punkt des Zustandes wieder um eins nach links geschoben und in der Abbildung wird ein Schritt nach links gegangen.&lt;br /&gt;
; Rückwärts-Completer (Stufe nach unten): Dieser Fall tritt ein, wenn der Punkt am Anfang einer Regel angekommen ist. In diesem Fall geht es nach links eine Stufe hinab. In dem Zustand, in dem man ankommt, wird der Punkt um eins zurück nach links geschoben.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus kann unterwegs hängen bleiben, wenn der Rückwärts-Scanner einen Unterschied feststellt, oder der Rückwärts-Predictor keine Alternative mehr hat. Dann muss der Weg zum vorherigen Rückwärts-Predictor zurückgegangen und dort die nächste Alternative versucht werden. Gelangt man schließlich nach links an den Anfang des Stapels, wurde ein möglicher Syntaxbaum gefunden. Um die weiteren Bäume einer mehrdeutigen Grammatik zu finden, wird beim letzten Rückwärts-Predictor weitergemacht und dort die Suche bis zur nächsten vollständigen Alternative fortgesetzt.&lt;br /&gt;
&lt;br /&gt;
=== Pseudocode ===&lt;br /&gt;
Der folgende Pseudocode beschreibt den gesamten Ablauf des Algorithmus:&lt;br /&gt;
&lt;br /&gt;
 Gegeben seien die zu parsenden Symbole s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;...s&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;&lt;br /&gt;
 (&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;,...,&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;) = &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;ParseText&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;(&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;...&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;)&lt;br /&gt;
 Falls die finale Startregel „S -&amp;gt;...*“ in &amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; enthalten ist:&lt;br /&gt;
  &amp;#039;&amp;#039;i&amp;#039;&amp;#039; = &amp;#039;&amp;#039;N&amp;#039;&amp;#039;&lt;br /&gt;
  &amp;#039;&amp;#039;j&amp;#039;&amp;#039; = &amp;#039;&amp;#039;0&amp;#039;&amp;#039;&lt;br /&gt;
  &amp;#039;&amp;#039;b&amp;#039;&amp;#039; = Liste von Earley-Zuständen mit als einzigem Element der finalen Startregel&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;BaumRekursion&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;(&amp;#039;&amp;#039;i&amp;#039;&amp;#039;,&amp;#039;&amp;#039;j&amp;#039;&amp;#039;,&amp;#039;&amp;#039;b&amp;#039;&amp;#039;,(&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;,...,&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;))&lt;br /&gt;
 Sonst:&lt;br /&gt;
  gebe Syntaxfehler aus&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Funktion&amp;#039;&amp;#039;&amp;#039; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;ParseText&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;...s&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;):&lt;br /&gt;
  Lege leere Zustandsmengen &amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; mit &amp;#039;&amp;#039;i&amp;#039;&amp;#039;=0..&amp;#039;&amp;#039;N&amp;#039;&amp;#039; an&lt;br /&gt;
  Füge die Startregel „S -&amp;gt;*...“ zu &amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt; dazu&lt;br /&gt;
  Für &amp;#039;&amp;#039;i&amp;#039;&amp;#039;=0..&amp;#039;&amp;#039;N&amp;#039;&amp;#039;:&lt;br /&gt;
    Füge Early-Zustände gemäß den drei Regeln predictor, scanner und completer&lt;br /&gt;
        zu &amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; hinzu, solange bis keine mehr hinzugefügt werden können&lt;br /&gt;
  gebe Zustandsmengen (&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;,...,&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;) zurück&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Funktion&amp;#039;&amp;#039;&amp;#039; &amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;BaumRekursion&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;(&amp;#039;&amp;#039;i&amp;#039;&amp;#039;,&amp;#039;&amp;#039;j&amp;#039;&amp;#039;,&amp;#039;&amp;#039;b&amp;#039;&amp;#039;,(&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;,...,&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;)):&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;&amp;#039;&amp;#039;//i: Index der aktuellen Zustandsmenge Q&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;&amp;#039;&amp;#039;//j: Index des aktuellen Zustandes b&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt; im Baum b&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
  Solange &amp;#039;&amp;#039;i&amp;#039;&amp;#039; &amp;gt; 0:&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;&amp;#039;&amp;#039;//Rückwärts-Predictor&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
    Falls im Zustand &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; vor dem Punkt ein Nonterminal steht:&lt;br /&gt;
      &amp;#039;&amp;#039;W&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; = Wert des Nonterminals vor dem Punkt des Zustandes &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;&lt;br /&gt;
      &amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; = Startindex des Zustandes &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;&lt;br /&gt;
      &amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; = Punktposition des Zustandes &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; (0 entspricht dem Anfang)&lt;br /&gt;
      Für alle finalen Zustände &amp;#039;&amp;#039;z&amp;#039;&amp;#039; in &amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; mit Wertigkeit &amp;#039;&amp;#039;W&amp;#039;&amp;#039;, Startindex &amp;#039;&amp;#039;k&amp;#039;&amp;#039; und Punktposition &amp;#039;&amp;#039;p&amp;#039;&amp;#039;,&lt;br /&gt;
          für die gilt &amp;#039;&amp;#039;W&amp;#039;&amp;#039; = &amp;#039;&amp;#039;W&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; und ((&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;-1 = 0 und &amp;#039;&amp;#039;k&amp;#039;&amp;#039; = &amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;) oder (&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;-1 &amp;gt; 0 und &amp;#039;&amp;#039;k&amp;#039;&amp;#039;-&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; &amp;gt;= &amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;-1)):&lt;br /&gt;
        Hänge Kopie von &amp;#039;&amp;#039;z&amp;#039;&amp;#039; hinten an &amp;#039;&amp;#039;b&amp;#039;&amp;#039; an (alternativ: füge z nach &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; ein)&lt;br /&gt;
        BaumRekursion(&amp;#039;&amp;#039;i&amp;#039;&amp;#039;,&amp;#039;&amp;#039;j+1&amp;#039;&amp;#039;,&amp;#039;&amp;#039;b&amp;#039;&amp;#039;,(&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;,...,&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;))&lt;br /&gt;
        Lösche das hinterste Element von &amp;#039;&amp;#039;b&amp;#039;&amp;#039; (alternativ: lösche Element &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j+1&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt;)&lt;br /&gt;
      Beende den Funktionsaufruf (&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;return&amp;#039;&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;)&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;&amp;#039;&amp;#039;//Rückwärts-Scanner&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
    Falls im Zustand &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; vor dem Punkt ein Terminal steht:&lt;br /&gt;
      Falls das Terminal vor dem Punkt gleich s&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;i&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; ist:&lt;br /&gt;
        Setze Punkt von &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; um eins zurück&lt;br /&gt;
        &amp;#039;&amp;#039;i&amp;#039;&amp;#039; = &amp;#039;&amp;#039;i&amp;#039;&amp;#039;-1&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;&amp;#039;&amp;#039;//Rückwärts-Completer&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
    Falls der Punkt von &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; am Anfang steht:&lt;br /&gt;
      &amp;#039;&amp;#039;j&amp;#039;&amp;#039; = &amp;#039;&amp;#039;j&amp;#039;&amp;#039;-1&lt;br /&gt;
      Setze Punkt von &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; um eins zurück&lt;br /&gt;
  Falls &amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;#039;&amp;#039;j&amp;#039;&amp;#039;&amp;lt;/sub&amp;gt; die Startregel ist:&lt;br /&gt;
    Gebe gefundenen Syntax-Baum &amp;#039;&amp;#039;b&amp;#039;&amp;#039; aus&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;&amp;#039;&amp;#039;//Ausgabe bei der oben gezeigten Grammatik und dem Beispiel n+n&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
 b =&lt;br /&gt;
   S -&amp;gt; *E  , 0&lt;br /&gt;
   E -&amp;gt; *E+T , 0&lt;br /&gt;
   E -&amp;gt; *T  , 0&lt;br /&gt;
   T -&amp;gt; *F  , 0&lt;br /&gt;
   F -&amp;gt; *n  , 0&lt;br /&gt;
   T -&amp;gt; *F  , 2&lt;br /&gt;
   F -&amp;gt; *n  , 2&lt;br /&gt;
&lt;br /&gt;
== Auswertung des Syntaxbaumes ==&lt;br /&gt;
Um den mathematischen Ausdruck der gezeigten Beispiel-Grammatik auszuwerten, kann mithilfe eines Stacks direkt eine Handlungsvorschrift für die Berechnung erzeugt werden. Dazu wird die Reihenfolge der ermittelten Liste von Zuständen umgekehrt (oder rückwärts durchlaufen) und alle nicht für die Berechnung relevanten Regeln gelöscht oder ignoriert. Für jeden Schritt wird die entsprechende Zahl von Eingangswerten der Operation aus dem [[Stapelspeicher|Stack]] geholt bzw. das Ergebnis der Operation in den Stack zurückgeschoben. Für das obige Beispiel ergibt sich:&lt;br /&gt;
&lt;br /&gt;
 F -&amp;gt; *n  , 2: Schiebe n in den Stack&lt;br /&gt;
 T -&amp;gt; *F  , 2&lt;br /&gt;
 F -&amp;gt; *n  , 0: Schiebe n in den Stack&lt;br /&gt;
 T -&amp;gt; *F  , 0&lt;br /&gt;
 E -&amp;gt; *T  , 0&lt;br /&gt;
 E -&amp;gt; *E+T , 0: Hole zwei Werte aus dem Stack, addiere&lt;br /&gt;
         sie und schiebe das Ergebnis in den Stack&lt;br /&gt;
 S -&amp;gt; *E  , 0: Hole Wert aus dem Stack und gebe ihn aus&lt;br /&gt;
&lt;br /&gt;
Auf diese Weise kann ein beliebig komplexer und verschachtelter mathematischer Ausdruck geparst und ausgewertet werden.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Jay Earley&lt;br /&gt;
   |Titel=An efficient context-free parsing algorithm&lt;br /&gt;
   |Sammelwerk=Communications of the [[Association for Computing Machinery]]&lt;br /&gt;
   |Band=13&lt;br /&gt;
   |Nummer=2&lt;br /&gt;
   |Datum=1970&lt;br /&gt;
   |Seiten=94–102&lt;br /&gt;
   |Online=[http://ccl.pku.edu.cn/alcourse/nlp/LectureNotes/An_Efficient_Context_Free_Parsing_Algorithm%20%28Earley%20Algorithm%29.pdf ccl.pku.edu.cn]&lt;br /&gt;
   |Format=PDF&lt;br /&gt;
   |KBytes=902}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=John Aycock, R. Nigel Horspool&lt;br /&gt;
   |Titel=Practical Earley Parsing&lt;br /&gt;
   |Sammelwerk=The Computer Journal&lt;br /&gt;
   |Band=45&lt;br /&gt;
   |Nummer=6&lt;br /&gt;
   |Datum=2002&lt;br /&gt;
   |Seiten=620–630&lt;br /&gt;
   |Online=[http://www.cs.uvic.ca/~nigelh/Publications/PracticalEarleyParsing.pdf cs.uvic.ca]&lt;br /&gt;
   |Format=PDF&lt;br /&gt;
   |KBytes=162}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Dick Grune, Ceriel J. H. Jacobs&lt;br /&gt;
   |Titel=Parsing Techniques. A Practical Guide&lt;br /&gt;
   |Auflage=1.&lt;br /&gt;
   |Verlag=Ellis Horwood&lt;br /&gt;
   |Ort=New York&lt;br /&gt;
   |Datum=1990&lt;br /&gt;
   |ISBN=0-13-651431-6&lt;br /&gt;
   |Seiten=149–163&lt;br /&gt;
   |Online=[ftp://ftp.cs.vu.nl/pub/dick/PTAPG_1st_Edition/BookBody.pdf ftp.cs.vu.nl]&lt;br /&gt;
   |Format=PDF&lt;br /&gt;
   |KBytes=1900}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Theorie formaler Sprachen]]&lt;br /&gt;
[[Kategorie:Dynamische Programmierung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Invisigoth67</name></author>
	</entry>
</feed>