WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Top-Down-Parsing mit LL(1) Grammatiken Tobias Richling Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen - Grammatiken und Sprachen - Funktionsweise und Formen des Parsers - Fehlerbehandlung beim Parsen Merkmale und Einschränkungen von LL(1) Grammatiken Berechnungsgrundlagen für LL(1) Parsing - FIRST und FOLLOW - Die Parsing-Tabelle Algorithmen für LL(1) Parsing - Rekursives LL(1) Parsing - Nicht-rekursives LL(1) Parsing Fazit und Ausblick 2 WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen - Grammatiken und Sprachen Was ist eine Grammatik / Sprache und woraus besteht Sie? Wie lassen sich Grammatiken kategorisieren? Eine Beispielgrammatik Schreibkonventionen - Funktionsweise und Formen des Parsers - Fehlerbehandlung beim Parsen Merkmale und Einschränkungen von LL(1) Grammatiken Berechnungsgrundlagen für LL(1) Parsing Algorithmen für LL(1) Parsing Fazit und Ausblick 4 Definition: Grammatik WIRTSCHAFTS INFORMATIK Eine Grammatik ist formal definiert durch G = (N, T, P, S) N: Die Menge der nicht-terminalen Symbole T: Die Menge der terminalen Symbole P: Die Menge der Produktionen - P1: U α (U ∈ (N ∪ T)*N(N ∪ T)*, α ∈ (N ∪ T)*) S: Das Startsymbol (∈ N) 5 Kategorisierung von Grammatiken WIRTSCHAFTS INFORMATIK Grammatiken lassen sich durch die Chomsky-Hierarchie kategorisieren - Typ 0: rekursiv aufzählbar Typ 1: kontextsensitiv Typ 2: kontextfrei Typ 3: regulär Typ 3 Typ 2 Typ 1 Typ 0 6 Kontextfreie Grammatiken WIRTSCHAFTS INFORMATIK Kontextfreie Grammatiken sind vom Chomsky-Typ 2. Alle Produktionen haben folgende Form: Aα A ist genau ein nicht-Terminal. α ist eine beliebige Kombination aus Terminalen und nicht Terminalen. Vorteil: nicht-Terminal A kann immer ersetzt werden, unabhängig von seiner Nachbarschaft. 7 Eine Beispielgrammatik WIRTSCHAFTS INFORMATIK Gegeben seien folgende Produktionen: - EXPR VAR OP VAL - EXPR ( EXPR ) - EXPR EXPR REL EXPR - VAR x | y - VAL 1 | 2 | 3 | … | 9 - OP = | != | < | > | <= | >= - REL and | or N = {EXPR, VAR, OP, VAL, REL} T = {(, ), x, y, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, =, !=, <, >, <=, >=, and, or} S = EXPR Welche Sätze lassen sich mit dieser Grammatik bilden? 8 Beispiele WIRTSCHAFTS INFORMATIK Startsymbol EXPR Regel 3 EXPR Regel 1 für EXPR VAR Auflösen in Terminale x REL OP != VAL 5 1. EXPR VAR OP VAL 2. EXPR ( EXPR ) 3. EXPR EXPR REL EXPR or EXPR VAR OP VAL y = 7 4. VAR x | y 5. VAL 1 | 2 | 3 | … | 9 6. OP = | != | < | > | <= | >= 7. REL and | or 9 Beispiele WIRTSCHAFTS INFORMATIK Startsymbol EXPR Regel 3 EXPR REL Regel 1 / 2 VAR OP VAL Regel 3 x > 3 EXPR and ( EXPR ) REL Regel 1 / 1 VAR OP VAL Restliche NT auflösen y = 5 1. EXPR VAR OP VAL 2. EXPR ( EXPR ) 3. EXPR EXPR REL EXPR EXPR or EXPR VAR OP VAL y = 7 4. VAR x | y 5. VAL 1 | 2 | 3 | … | 9 6. OP = | != | < | > | <= | >= 7. REL and | or 10 Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen - Grammatiken und Sprachen - Funktionsweise und Formen des Parsers Einordnung des Parsers Arten des Parsing - Fehlerbehandlung beim Parsen Merkmale und Einschränkungen von LL(1) Grammatiken Berechnungsgrundlagen für LL(1) Parsing Algorithmen für LL(1) Parsing 11 Einordnung des Parser WIRTSCHAFTS INFORMATIK Parser Lexikalische Analyse Syntaktische Analyse Semantische Analyse Codegenerierung / -optimierung •Eingabe: Zeichenstrom •Ausgabe: Tokenstrom •Ausgabe: Syntaxbaum •Ausgabe: Syntaxbaum •Ausgabe: Maschinencode 12 Aufgabe des Parsers WIRTSCHAFTS INFORMATIK Die Aufgabe des Parser ist die syntaktische Analyse einer Tokenfolge. Die Tokenfolge wird von links nach rechts verarbeitet. Es muss geprüft werden, ob die vorliegende Tokenfolge aus den Produktionen gebildet werden kann. Es werden schrittweise Produktionen angewendet. Wenn sich die Eingabefolge bilden lässt, ist diese syntaktisch korrekt, andernfalls enthält sie (oder der Parser) Syntaxfehler. 13 Arten des Parsing WIRTSCHAFTS INFORMATIK Nach „Richtung“ - Top-Down-Parsing - Bottom-Up-Parsing Nach „Weitblick“ - Nicht vorausschauendes (non-predictive) Parsing - Vorausschauendes (predictive) Parsing Nach „Algorithmusstruktur“ - Rekursiv - Nicht rekursiv 14 Die Idee des Parsing WIRTSCHAFTS INFORMATIK ( x = 7 ) EXPR ( EXPR ( VAR ( x OP ( x = VAL ( x = 7 ) OP VAL VAL ) ) 1. 2. 3. 4. 5. 6. 7. EXPR VAR OP VAL EXPR ( EXPR ) EXPR EXPR REL EXPR VAR x | y VAL 1 | 2 | 3 | … | 9 OP = | != | < | > | <= | >= REL and | or ) ) 15 Probleme aus den Beispielen WIRTSCHAFTS INFORMATIK Zwei Zentrale Fragen: 1. Welches nicht-Terminal soll als nächstes expandiert werden? 2. Welche Produktion wird verwendet, wenn es mehrere Alternativen gibt. Diese beiden Fragen sind für das Parsen zentral, wie sich später noch zeigen wird. 16 Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen - Grammatiken und Sprachen - Funktionsweise und Formen des Parsers - Fehlerbehandlung beim Parsen Welche Möglichkeiten hat der Parser, auf Fehler zu reagieren? Merkmale und Einschränkungen von LL(1) Grammatiken Berechnungsgrundlagen für LL(1) Parsing Algorithmen für LL(1) Parsing 17 Was wenn‘s schiefgeht? WIRTSCHAFTS INFORMATIK Die Nachfolgend beschriebenen Parsing-Methoden habe die „viable-prefix“ Eigenschaft. D.h. sie erkennen Fehler so früh wie möglich. Ein Quellprogramm hat (wahrscheinlich) mehr als einen Fehler. Also wäre es schön, wenn der Parser zunächst weiterarbeiten würde, wenn er einen Fehler findet. Sonst muss der Entwickler von Fehler zu Fehler „hoppeln“. Aber: was soll der Parser denn tun? - Präzise Fehlermeldung - Trotzdem weitermachen (Error recovery) und wie? - Möglichst wenig zusätzliche Arbeit dadurch produzieren. 18 Ansätze zur Fehlerbehandlung WIRTSCHAFTS INFORMATIK Panic-Mode Recovery - Der Parser überspringt ab dem Fehler eine Menge von Token, bis er ein „synchronizing Token“ findet. Dazu eignen sich z.B. in C# „}“ oder „;“ Phrase-Level Recovery - Wenn der Parser weiß, was klemmt, kann er die Eingabezeichenfolge verändern. Zum Beispiel: fehlendes Semikolon. Error Productions - Bestimmte Fehler werden antizipiert und für diese existieren - Produktionen. Der Parser kann arbeiten, weiß aber, dass ein Fehler aufgetreten ist, wenn er eine Fehlerproduktion verwendet hat. Global Correction - Finde eine minimale Folge von Änderungen, um aus einem falschen - ein korrektes Programm zu machen. Sehr aufwändig. 19 WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Merkmale und Einschränkungen von LL(1) Grammatiken Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen Merkmale und Einschränkungen von LL(1) Grammatiken - Merkmale LL(1) Grammatiken - Diverse Probleme und mögliche Lösungen - Die „verwandelte“ Beispielgrammatik Berechnungsgrundlagen für LL(1) Parsing Algorithmen für LL(1) Parsing 21 Merkmale von LL(1)-Grammatiken WIRTSCHAFTS INFORMATIK Zum Begriff LL(1): - Erstes L: Verarbeite Eingabe von links nach rechts. - Zweites L: Expandiere immer das am weitesten links stehende nicht-Terminal (Frage 1!). - (1): Es wird immer ein Eingabezeichen (Lookahed) zur eindeutigen Entscheidung über die zu verwendende Produktion benutzt (Frage 2!). Merkmale / Einschränkungen: - Kontextfrei - Nicht mehrdeutig - Nicht linksrekrusiv - „Linksbündig“ (left factoring) - „Linkseindeutig“ 22 Linksrekursivität: Das Problem WIRTSCHAFTS INFORMATIK Man betrachte den Ausdruck x = 7 and y = 10 Wie kann der Parser zwischen Regel 1 und 3 entscheiden? Antwort: Gar nicht! 1. EXPR VAR OP VAL 2. EXPR ( EXPR ) 3. EXPR EXPR REL EXPR 4. VAR x | y 5. VAL 1 | 2 | 3 | … | 9 6. OP = | != | < | > | <= | >= 7. REL and | or 23 Linksrekursivität: Definition WIRTSCHAFTS INFORMATIK Eine Produktion ist linksrekrusiv, wenn sie folgende Form hat: EXPR EXPR REL EXPR Hier taucht das zu ersetzende nicht-Terminal EXPR direkt am Anfang im Körper der Produktion auf. Im allgemeinen reicht es aus, wenn sich diese Form erst in mehreren Schritten ergibt. Ist folgende Produktion linksrekursiv? EXPR ( EXPR ) 24 Linksrekursivität: Weg damit! WIRTSCHAFTS INFORMATIK Die linksrekursive Produktion muss korrigiert werden, der linksrekursive Teil muss weg: EXPR‘ REL EXPR EXPR‘ Das neue nicht-Terminal wird an alles angehängt, was eine EXPR ist: EXPR VAR OP VAL EXPR‘ EXPR ( EXPR ) EXPR‘ Jetzt muss aber immer auf jede EXPR eine EXPR‘ folgen. EXPR‘ muss wegfallen können, also Erweiterung der ersten Regel: EXPR‘ REL EXPR EXPR‘ | ε 25 Linksbündigkeit: Das Problem WIRTSCHAFTS INFORMATIK Eine neue Anforderung: man möchte auch Ausdrücke der Form „x = y“ schreiben können. Also Erweiterung der Grammatik: EXPR VAR OP VAL (alt) EXPR VAR OP VAR (neu) Man betrachte den Ausdruck x=7 Wie kann sich der Parser zwischen den beiden Regeln entscheiden? Antwort: Gar nicht! 26 Linksbündigkeit: Die Lösung WIRTSCHAFTS INFORMATIK Nach dem Motto: „Was du später noch erledigen kannst, da kümmere dich jetzt noch nicht drum!“ Behalte die gemeinsamen Teile aller Alternativen in einer Regel. Lagere die Varianten in einer neuen Regel mit entsprechenden Alternativen aus. Also Änderung der Grammatik: EXPR VAR OP ETAIL ETAIL VAR | VAL 27 Linkseindeutigkeit: Das Problem WIRTSCHAFTS INFORMATIK Eine neue (dumme) Idee: als Variable soll auch die „1“ erlaubt sein. (Ergibt in einer leicht abgewandelten Grammatik aber Sinn) Man betrachte nun folgenden Ausdruck x=1 Die „1“ steht für VAR oder VAL. Wie soll sich der Parser für die gemeinte Variante entscheiden? Antwort: Gar nicht! 28 Linkseindeutigkeit: Die Lösung WIRTSCHAFTS INFORMATIK „Lass den Unfug!“ Produktionen dieser Art müssen entfernt oder umgeschrieben werden. Keine allgemeine Regel hierzu. In C# ist für Bezeichner z.B. vorgeschrieben, dass diese mit einem Buchstaben beginnen müssen. 29 Die „neue“ Beispielgrammatik WIRTSCHAFTS INFORMATIK 1. 2. 3. 4. 5. 6. 7. 8. EXPR VAR OP ETAIL EXPR‘ EXPR ( EXPR ) EXPR‘ EXPR‘ REL EXPR EXPR‘ | ε ETAIL VAR | VAL VAR x | y VAL 1 | 2 | 3 | … | 9 OP = | != | < | > | <= | >= REL and | or 30 WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Berechnungsgrundlagen für LL(1) Parsing Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen Merkmale und Einschränkungen von LL(1) Grammatiken Berechnungsgrundlagen für LL(1) Parsing - FIRST und FOLLOW Definition & Berechnung der Menge FIRST Definition & Berechnung der Menge FOLLOW - Die Parsing-Tabelle Algorithmen für LL(1) Parsing 32 Die Menge FIRST WIRTSCHAFTS INFORMATIK Idee: Mit welchen Terminalen kann eine Zeichenfolge beginnen, die aus einem bestimmten nicht-Terminal abgeleitet ist? Untersuche alle Alternativen des fraglichen NT und deren erste Elemente. 1. 2. 3. 4. 5. 6. 7. 8. EXPR VAR OP ETAIL EXPR‘ EXPR ( EXPR ) EXPR‘ EXPR‘ REL EXPR EXPR‘ | ε ETAIL VAR | VAL VAR x | y VAL 1 | 2 | 3 | … | 9 OP = | != | < | > | <= | >= REL and | or Beispiele: FIRST(EXPR) = { x, y, ( } FIRST(EXPR’) = { and, or, ε } FIRST(ETAIL) = { x, y, 0, ..., 9 } 33 Die Menge FOLLOW WIRTSCHAFTS INFORMATIK Idee: Welche Terminale können direkt auf ein nichtTerminal folgen? Suche alle Vorkommnisse des gefragten NT im Körper der Produktionen und untersuche deren Nachfolger. 1. 2. 3. 4. 5. 6. 7. 8. EXPR VAR OP ETAIL EXPR‘ EXPR ( EXPR ) EXPR‘ EXPR‘ REL EXPR EXPR‘ | ε ETAIL VAR | VAL VAR x | y VAL 1 | 2 | 3 | … | 9 OP = | != | < | > | <= | >= REL and | or Beispiele: FOLLOW(EXPR) = { $, ), and, or } FOLLOW(EXPR’) = { $, ), and, or } FOLLOW(ETAIL) = { $, ), and, or } 34 Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen Merkmale und Einschränkungen von LL(1) Grammatiken Berechnungsgrundlagen für LL(1) Parsing - FIRST und FOLLOW - Die Parsing-Tabelle Aufbau der Parsing-Tabelle Berechnung der Parsing-Tabelle Algorithmen für LL(1) Parsing 35 Parsing-Tabelle: Motivation WIRTSCHAFTS INFORMATIK Beim „vom Hand parsen“ unserer Beispiele fiel die Auswahl der Produktion leicht: man verwendet „Okularinspektion“. Der Computer hat damit seine Schwierigkeiten. Der Mensch auch: bei komplexeren Sprachen (C#) oder längeren Eingaben. Wie lässt sich die Entscheidungssituation systematisieren? Welche Information steht in jedem Schritt zur Verfügung: - Ein nicht-Terminal, das zu expandieren ist, oder ein Terminal das gemacht werden muss. - Ein aktuelles Eingabesymbol. Was müssen wir daraus ermitteln: - Die zu verwendende Produktion 36 Die Parsing-Tabelle WIRTSCHAFTS INFORMATIK Für das „matchen“ braucht man keine Hilfe: passt oder passt nicht. Es reduziert sich also auf: M(NT, Lookahead) = Produktion Idee: fasse diese Informationen in einer Tabelle zusammen. Aufbau der Tabelle: - In den Zeilen befinden sich die nicht-Terminalen - In den Spalten befinden sich die Terminalen - In den Zellen steht die Produktion (leere Zelle Fehler) 37 Wie kommt man drauf? WIRTSCHAFTS INFORMATIK Zum Beispiel durch scharfes Nachdenken - Beispiel: EXPR soll - - expandiert werden. Welche Terminale kommen überhaupt in Frage? Antwort: (, x, y Welche Regeln für welches NT: ( Regel 2 x, y Regel 1 Oder formaler: durch die Mengen FIRST / FOLLOW 1. EXPR VAR OP ETAIL EXPR‘ 2. EXPR ( EXPR ) EXPR‘ 3. EXPR‘ REL EXPR EXPR‘ | ε 4. ETAIL VAR | VAL 5. VAR x | y 6. VAL 1 | 2 | 3 | … | 9 7. OP = | != | < | > | <= | >= 8. REL and | or 38 Ausschnitt aus der PT der BG WIRTSCHAFTS INFORMATIK ( x y E VAR O VAL E‘ E VAR O VAL E‘ ETAIL ETVAR ETVAR VAR VARx VARy EXPR EXPR‘ ) E ( E ) E‘ 0 E‘ε ETVAL 39 Parsing-Tabelle: Mehrdeutigkeiten WIRTSCHAFTS INFORMATIK Bei der Berechnung der Parsing-Tabelle können Mehrdeutigkeiten in der Grammatik auffallen. Diese zeigen sich durch mehrfache Einträge in einer Zelle. In unserem Beispiel betrifft dies die Regeln für EXPR‘ Auszug aus der Parsing-Tabelle EXPR‘ ( and or $ EXPR‘ ε E‘ REL EXPR EXPR‘ E‘ REL EXPR EXPR‘ EXPR‘ ε Oder Oder EXPR‘ ε EXPR‘ ε 40 Parsing-Tabelle: Mehrdeutigkeiten WIRTSCHAFTS INFORMATIK Wie kann das sein? Man betrachte den Ausdruck EXPR ... EXPR' REL EXPR or ( EXPR … or (x = 5) and … Welches EXPR‘ soll wie expandiert werden? Antwort: „Egal“ EXPR' ) EXPR' x=5 EXPR EXPR ... RELREL or or EXPR' EXPR' EXPR EXPR ( ( EXPR EXPR x=5 x=5 ) EXPR' EXPR' ) EXPR' EXPR' REL ε REL … ε … and and 41 Parsing-Tabelle: Mehrdeutigkeiten WIRTSCHAFTS INFORMATIK Was tun? „Entscheide dich!“ (für eine der Möglichkeiten) Hier: - Die Grammatik „sammelt“ „rechts unten“ im Baum EXPR‘ Symbole. - Heuristik: Expandiere immer das innerste EXPR‘ bei and / or und die „unnötigen“ EXPR‘ am Ende zu e. - Führt zu einem rechtslastigen Parse-Tree. EXPR‘ ( and or $ EXPR‘ ε E‘ REL EXPR EXPR‘ E‘ REL EXPR EXPR‘ EXPR‘ e Oder Oder EXPR‘ ε EXPR‘ ε 42 WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Algorithmen für LL(1) Parsing Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen Merkmale und Einschränkungen von LL(1) Grammatiken Berechnungsgrundlagen für LL(1) Parsing Algorithmen für LL(1) Parsing - Rekursives LL(1) Parsing Grundlagen des rekursiven Parsing Rekursives Parsen einer LL(1) Grammatik - Nicht-rekursives LL(1) Parsing 44 Rekursives Parsen: Die Idee WIRTSCHAFTS INFORMATIK Ein rekursiver Parser besteht aus einer Menge sich gegenseitig aufrufender Prozeduren. Es gibt eine Prozedur pro nicht-Terminal der Sprache, welche die Struktur der möglichen Alternativen „nachahmt“. - Bei mehreren Alternativen muss gewählt werden. Im Fall von LL(1) eindeutig, sonst u.U Backtracking Es gibt eine weitere Prozedur zum matchen von Terminalen. Wenn alles gemacht werden kann, ist die Folge ok, sonst enthält sie (oder der Parser) Fehler. 45 Rekursives Parsing: Algorithmus WIRTSCHAFTS INFORMATIK void A() { Wähle eine A-Produktion AX1X2…Xk; for (i = 1 to k) { if (Xi ist ein nicht-Terminal) Aufruf von Prozedur Xi; else if (Xi entspricht aktuellem Eingabesymbol) Gehe zum nächsten Eingabesymbol; else /* Fehler */ } } 46 Rekursives Parsing: Beispiel WIRTSCHAFTS INFORMATIK private void Expr() { switch (Lookahead) { case "(": Match(“(“); Expr(); Match(„)“); Expr_1(); break; private void Var() { switch (Lookahead.Value) { case "x": Match(“x“); break; case "y": Match(“y“); break; case "x": case "y": Var(); Op(); Val(); Expr_1(); break; default: Report("Syntax error", true); break; } default: Report("Error"); break; } } } 47 Agenda WIRTSCHAFTS INFORMATIK Grundlagen der Verarbeitung künstlicher Sprachen Merkmale und Einschränkungen von LL(1) Grammatiken Berechnungsgrundlagen für LL(1) Parsing Algorithmen für LL(1) Parsing - Rekursives LL(1) Parsing - Nicht-rekursives LL(1) Parsing Aufbau des nicht-rekursiven Parsing Ablauf des nicht-rekursiven Parsing Ein Beispiel dazu 48 Nicht-rekursives Parsing: Aufbau WIRTSCHAFTS INFORMATIK Eingabe X a + b Parser-Programm $ Ausgabe Y Z $ Parsing-Tabelle Stack 49 Nicht-rekursives Parsing WIRTSCHAFTS INFORMATIK Input ( x Stack xVAR = OP ( 7 VAL EXPR EXPR ) Erkannt = 7 ( ) 1. 2. 3. 4. 5. 6. 7. 8. x = 7 ) EXPR VAR OP ETAIL EXPR‘ EXPR ( EXPR ) EXPR‘ EXPR‘ REL EXPR EXPR‘ | ε ETAIL VAR | VAL VAR x | y VAL 1 | 2 | 3 | … | 9 OP = | != | < | > | <= | >= REL and | or 50 WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Fazit Fazit WIRTSCHAFTS INFORMATIK Formale Grundlagen stellen einen wichtigen Teil des Parsing dar. - FIRST - FOLLOW - Parsing Tabelle Die Algorithmen selber sind relativ einfach. Ein allgemeiner (auf einer Parsing-Table basierender) nicht rekursiver Parser ist recht schnell implementiert. - Wer Interesse hat, kann sich melden. Es gibt diverse Parser-Generatoren, die einem diese Arbeit (wenn man es so nennen will) jedoch abnehmen. 52 WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Vielen Dank für Ihre Aufmerksamkeit Haben Sie noch Fragen? WIRTSCHAFTSINFORMATIK Westfälische Wilhelms-Universität Münster WIRTSCHAFTS INFORMATIK Backup Formale Definition von FIRST WIRTSCHAFTS INFORMATIK 1. Wenn X ein Terminal ist, dann ist FIRST(X) = {X}. 2. Wenn X ein nicht-Terminal ist und eine Produktion X Y1Y2…Yk für ein k ≥ 1, dann ist a Bestandteil von FIRST(X) wenn es für ein beliebiges i in FIRST(Yi) ist, und ε in allen Mengen FIRST(Y1), …, FIRST(Yi-1) ist. Wenn ε in allen k Yi dann ist ε auch in FIRST(X) 3. Wenn X ε eine Produktion der Grammatik ist, dann ist ε in FIRST(X). 55 Formale Definition von FOLLOW WIRTSCHAFTS INFORMATIK 1. $ ist Element von FOLLOW(S), mit S als Startsymbol 2. Für eine Produktion sind alle Elemente aus FIRST(β) in FOLLOW(B), ausgenommen ε. 3. Wenn eine Produktion existiert oder bei der Produktion in der Menge FIRST(β) das ε enthalten ist, dann sind alle Elemente von FOLLOW(A) auch in FOLLOW(B) 56 Berechnung der Parsing-Tabelle WIRTSCHAFTS INFORMATIK 1. Durchlaufe alle Produktionen (A α) 2. Füge A α in der Zeile A in alle Spalten ein, die sich in FIRST(α) befinden. 3. Wenn ε in FIRST(α), dann trage die Regel auch noch in alle Spalten aus FOLLOW(A) ein (inklusive $) 57 Beispiel zu Regel 3 WIRTSCHAFTS INFORMATIK A(A) ABC B1|ε C2|ε ( ) 1 2 $ (A) BC BC BC BC B ε 1 ε ε C ε 2 ε A FIRST(A) = {(, 1, 2, ε} FIRST(B) = {1, ε} FIRST(C) = {2, ε} FOLLOW(A) = {), $} FOLLOW(B) = {2, ), $} FOLLOW(C) = {), $} FOLLOW(B C) = {1, 2, ε} Beispiele: $: A B C ε C ε ε ε (): A ( A ) ( B C ) (ε ε) () 2: A B C ε C 2 58 „Dangeling Else“ WIRTSCHAFTS INFORMATIK STMT if (BED) STMT CONDELSE STMT other CONDELSE else STMT | ε BED bool Ausdruck: if ( bool ) if (bool) other else other STMT if (bool) STMT If (bool) STMT CONDELSE CONDELSE other 59