<?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=Lookahead</id>
	<title>Lookahead - 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=Lookahead"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Lookahead&amp;action=history"/>
	<updated>2026-05-30T14:44:17Z</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=Lookahead&amp;diff=516411&amp;oldid=prev</id>
		<title>imported&gt;IvanP: Rechtschreibung</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Lookahead&amp;diff=516411&amp;oldid=prev"/>
		<updated>2019-01-10T19:33:50Z</updated>

		<summary type="html">&lt;p&gt;Rechtschreibung&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Dieser Artikel|behandelt Lookaheads bei der Syntaxanalyse im Compilerbau. Zu Look-ahead-assertions in regulären Ausdrücken siehe [[Regulärer Ausdruck#Look-around assertions|Regulärer Ausdruck]].}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lookahead&amp;#039;&amp;#039;&amp;#039; ist die Vorausschau auf Eingaben beim automatischen Verarbeiten von Texten im [[Compilerbau]].&lt;br /&gt;
&lt;br /&gt;
Die Anzahl von [[Token (Compilerbau)|Tokens]], die ein [[Parser]] vorausschaut, ist ein Maß für den Aufwand, der betrieben werden muss, um grammatikalische Konstruktionen der Eingabe eindeutig voneinander zu unterscheiden. Anhand dieser Anzahl &amp;#039;&amp;#039;k&amp;#039;&amp;#039; lassen sich Parser und Grammatiken formal klassifizieren.&lt;br /&gt;
&lt;br /&gt;
Als &amp;#039;&amp;#039;Lookahead&amp;#039;&amp;#039; wird unter anderem auch die Anzahl der &amp;#039;&amp;#039;Zeichen&amp;#039;&amp;#039; bezeichnet, die ein [[Tokenizer]] (lexikalischer Scanner) vorausschaut (der Wert 1 genügt für die meisten Programmiersprachen).&lt;br /&gt;
&lt;br /&gt;
Der Lookahead spielt eine Rolle beim Top-down-Parsing ([[LL-Parser]]), sowie beim [[Bottom-Up-Parser|Bottom-up-Parsing]]. Im Folgenden wird letzterer Fall beleuchtet.&lt;br /&gt;
Shift-Reduce-Parser, wie LR(0)-, SLR-, LR(1)-Parser, können in zwei unterschiedliche Konflikte geraten:&lt;br /&gt;
; Shift-reduce: Hier weiß der [[Compiler]] nicht, ob er shiften oder reduzieren soll.&lt;br /&gt;
; Reduce-reduce: Hier weiß der Compiler nicht, nach welcher Regel er reduzieren soll.&lt;br /&gt;
&lt;br /&gt;
Der Lookahead kann helfen, dies zu vermeiden. Kann eine Sprache anhand einer Grammatik konfliktfrei mit einem Lookahead vom &amp;lt;math&amp;gt;k=1&amp;lt;/math&amp;gt; mit einem LR(&amp;#039;&amp;#039;k&amp;#039;&amp;#039;)-Parser geparst werden, so handelt es sich um eine LR(1)-Grammatik.&lt;br /&gt;
&lt;br /&gt;
== Shift-Reduce-Beispiel ==&lt;br /&gt;
Es existiert ein bekanntes Shift-Reduce-Problem, das sogenannte [[Dangling else|Dangling-Else-Problem]].&lt;br /&gt;
&lt;br /&gt;
Gegeben sei die Regel in [[Backus-Naur-Form]]:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;statement&amp;gt; ::= IF &amp;lt;expression&amp;gt; THEN &amp;lt;statement&amp;gt;&lt;br /&gt;
               | IF &amp;lt;expression&amp;gt; THEN &amp;lt;statement&amp;gt; ELSE &amp;lt;statement&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier weiß der Compiler nicht, ob er reduzieren soll oder mit &amp;lt;code&amp;gt;ELSE&amp;lt;/code&amp;gt; fortfahren soll, falls eine Alternative folgen sollte. Dieses Problem tritt meistens dann auf, wenn man den Parser mit dem [[Parsergenerator]] [[Yacc]] oder [[GNU Bison]] automatisch generieren lässt, wird allerdings von diesen automatisch richtig gelöst. Dabei spielt es keine Rolle, ob ein Lookahead vorhanden ist oder nicht.&lt;br /&gt;
&lt;br /&gt;
Eine mögliche Lösung dieses Problems ist folgende:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;statement&amp;gt; ::= &amp;lt;matched&amp;gt;&lt;br /&gt;
               | &amp;lt;unmatched&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;matched&amp;gt;   ::= IF &amp;lt;expression&amp;gt; THEN &amp;lt;matched&amp;gt; ELSE &amp;lt;matched&amp;gt;&lt;br /&gt;
               | other statements&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;unmatched&amp;gt; ::= IF &amp;lt;expression&amp;gt; THEN &amp;lt;statement&amp;gt;&lt;br /&gt;
               | IF &amp;lt;expression&amp;gt; THEN &amp;lt;matched&amp;gt; ELSE &amp;lt;unmatched&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ist aber äußerst schwer zu lesen.&lt;br /&gt;
&lt;br /&gt;
Eine schlichte andere Möglichkeit in GNU Bison (Yacc) wäre:&lt;br /&gt;
&lt;br /&gt;
 %token KW_ELSE&lt;br /&gt;
 %token KW_IF&lt;br /&gt;
 &lt;br /&gt;
 %nonassoc LOWER_THAN_ELSE&lt;br /&gt;
 %nonassoc KW_ELSE&lt;br /&gt;
 &lt;br /&gt;
 ifstatement: KW_IF &amp;#039;(&amp;#039; assignment &amp;#039;)&amp;#039; block2 %prec LOWER_THAN_ELSE&lt;br /&gt;
            | KW_IF &amp;#039;(&amp;#039; assignment &amp;#039;)&amp;#039; block2 KW_ELSE block2&lt;br /&gt;
            ;&lt;br /&gt;
&amp;lt;code&amp;gt;%prec LOWER_THAN_ELSE&amp;lt;/code&amp;gt; weist hierbei der Regel, in der es steht, die Präzedenz von &amp;lt;code&amp;gt;LOWER_THAN_ELSE&amp;lt;/code&amp;gt; zu. Diese steht über der Tokendefinition von &amp;lt;code&amp;gt;KW_ELSE&amp;lt;/code&amp;gt;, gibt der ersten Regel zu &amp;lt;code&amp;gt;ifstatement&amp;lt;/code&amp;gt; also eine niedrigere Präzedenz bei der Reduce-Entscheidung als der zweiten.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.gobosoft.com/eiffel/gobo/geyacc/algorithm.html Shift-Reduce- und Reduce-Reduce-Problem] trotz Lookahead&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Compilerbau]]&lt;/div&gt;</summary>
		<author><name>imported&gt;IvanP</name></author>
	</entry>
</feed>