www.wikidata.de-de.nina.az
Dieser Artikel behandelt Lookaheads bei der Syntaxanalyse im Compilerbau Zu Look ahead assertions in regularen Ausdrucken siehe Regularer Ausdruck Lookahead ist die Vorausschau auf Eingaben beim automatischen Verarbeiten von Texten im Compilerbau Die Anzahl von Tokens die ein Parser vorausschaut ist ein Mass fur den Aufwand der betrieben werden muss um grammatikalische Konstruktionen der Eingabe eindeutig voneinander zu unterscheiden Anhand dieser Anzahl k lassen sich Parser und Grammatiken formal klassifizieren Als Lookahead wird unter anderem auch die Anzahl der Zeichen bezeichnet die ein Tokenizer lexikalischer Scanner vorausschaut der Wert 1 genugt fur die meisten Programmiersprachen Der Lookahead spielt eine Rolle beim Top down Parsing LL Parser sowie beim Bottom up Parsing Im Folgenden wird letzterer Fall beleuchtet Shift Reduce Parser wie LR 0 SLR LR 1 Parser konnen in zwei unterschiedliche Konflikte geraten Shift reduce Hier weiss der Compiler nicht ob er shiften oder reduzieren soll Reduce reduce Hier weiss der Compiler nicht nach welcher Regel er reduzieren soll Der Lookahead kann helfen dies zu vermeiden Kann eine Sprache anhand einer Grammatik konfliktfrei mit einem Lookahead vom k 1 displaystyle k 1 mit einem LR k Parser geparst werden so handelt es sich um eine LR 1 Grammatik Shift Reduce Beispiel BearbeitenEs existiert ein bekanntes Shift Reduce Problem das sogenannte Dangling Else Problem Gegeben sei die Regel in Backus Naur Form lt statement gt IF lt expression gt THEN lt statement gt IF lt expression gt THEN lt statement gt ELSE lt statement gt Hier weiss der Compiler nicht ob er reduzieren soll oder mit ELSE 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 lasst wird allerdings von diesen automatisch richtig gelost Dabei spielt es keine Rolle ob ein Lookahead vorhanden ist oder nicht Eine mogliche Losung dieses Problems ist folgende lt statement gt lt matched gt lt unmatched gt lt matched gt IF lt expression gt THEN lt matched gt ELSE lt matched gt other statements lt unmatched gt IF lt expression gt THEN lt statement gt IF lt expression gt THEN lt matched gt ELSE lt unmatched gt Dies ist aber ausserst schwer zu lesen Eine schlichte andere Moglichkeit in GNU Bison Yacc ware token KW ELSE token KW IF nonassoc LOWER THAN ELSE nonassoc KW ELSE ifstatement KW IF assignment block2 prec LOWER THAN ELSE KW IF assignment block2 KW ELSE block2 prec LOWER THAN ELSE weist hierbei der Regel in der es steht die Prazedenz von LOWER THAN ELSE zu Diese steht uber der Tokendefinition von KW ELSE gibt der ersten Regel zu ifstatement also eine niedrigere Prazedenz bei der Reduce Entscheidung als der zweiten Weblinks BearbeitenShift Reduce und Reduce Reduce Problem trotz Lookahead Abgerufen von https de wikipedia org w index php title Lookahead amp oldid 184598156