Parsing regulärer Ausdrücke Karin Haenelt 25.4.2009 1 Inhalt kontextfreie Grammatik für reguläre Ausdrücke Grundlagen Parsebaum: konkrete Syntax Syntaxbaum: abstrakte Syntax Algorithmus: Parsing regulärer Ausdrücke Erkennung Konstruktion des Syntaxbaumes © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 2 Grammatik für reguläre Ausdrücke reguläre Ausdrücke beschreiben reguläre Sprachen Notationssprache für reguläre Ausdrücke ist keine reguläre Sprache Sprache enthält Klammern die beliebig ineinander geschachtelt werden können ausbalanciert sein müssen (Anzahl öffnender Klammern = Anzahl schließender Klammern) ist eine kontextfreie Sprache Erkennung mit Automaten mit Gedächtnis © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 3 Konkrete Syntax und abstrakte Syntax konkrete Syntax Ableitungsbaum der Erkennung mit kontextfreier Grammatik Parsebaum Ziel: effiziente Erkennung abstrakte Syntax Abstraktion von Details, die zur Weiterverarbeitung nicht gebraucht werden Syntaxbaum Ziel: effiziente Weiterverarbeitung Ziel: kontextfreie Grammatik – nach der konkrete Syntax und abstrakte Syntax möglichst ähnlich sind © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 4 Grammatik für arithmetische Ausdrücke, 1. Entwurf E E E | EE 2 Ableitungen mit 2 Strukturen für 1+2x3 E E 1 E + E E 2 © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 x x E E 3 E + E E 3 1 2 unbrauchbar zur weiteren Auswertung des Ausdrucks, falsche Priorität der Rechenregeln 5 Grammatik für reguläre Ausdrücke, 2. Entwurf Berücksichtigung der Priorität der Operatoren E PE|P P T P |T T id | T * | ( E ) Expression Product Terminal + vereinigt Produkte (Operator • hat seine Argumente zuvor gebunden) • konkateniert Terme (Operator * hat sein Argument zuvor gebunden) * bindet sein Argument zuerst © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 6 Kontextfreie Grammatik für reguläre Ausdrücke Grammatik E PE|P Beispiel (a|b)*abb Ableitungsbaum E P P T P |T T a | ... | | | T * | ( E ) T ( Die Grammatikregel enthält eine P Rechtsrekursion. Rechtsrekursion lässt sich durch Iteration darstellen. T In einer iterativen Darstellung treten die a markierten Ableitungen nicht auf © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 • T * E ) | E P P T a • P T • P b T b T b 7 Erkennen regulärer Ausdrücke Grundlage: Grammatik für reguläre Ausdrücke E→ P+E|P Ausdruck P → T •P | T Produkt T → 0 | 1 |ε | Ø | T* | (E) Terminal (Terminalsymbole können erweitert werden) weder Lexikon noch Grammatik sind komplex oder veränderlich Erkenner kann direkt aus der Grammatik abgeleitet werden, indem man für jede Variable eine Prozedur schreibt (Hopcroft/Ullman, 1988: 128/129) © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 8 1 procedure FINDE_AUSDRUCK; 3 4 7 12 16 21 23 26 27 31 Algorithmus zur Erkennung regulärer Ausdrücke begin nach Hopcroft/Ullmann 1988:128 FINDE_PRODUKT; while erste Symbol von STRING ist ’+’ do // Disjunktion E PE|P { stringIndex++; FINDE_PRODUKT; } end FINDE_AUSDRUCK; procedure FINDE_PRODUKT; begin P T P |T FINDE_TERM; T id | T * | ( E ) while erstes Symbol von String ist ’•’ do // Konkatenation { stringIndex++; FINDE_TERM; } end FINDE_PRODUKT; procedure FINDE_TERM; T id | ( E ) | T * begin erstes Symbol von STRING ist TERMINAL then { stringIndex++;} if else if erstes Symbol von STRING ist ’(’ then { stringIndex++; FINDE_AUSDRUCK; E PE|P erstes Symbol von STRING ist ’)’ then stringIndex++; if Fehler } else while erstes Symbol von STRING ist ’*’ do // Kleenesche Hülle {stringIndex++;} © Karin Haenelt, 9 end FINDE_TERM; Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 Ableitungsstruktur nach Algorithmus 1E Beispiel: (a|b)*abb 3P 12T 23( 26E 3P 12T 21a © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 4| 13• 27) 31* 16T 21a 13• 16T 21b 13• 16T 21b 7P 12T 21b Die Zahlen geben die Zeile des Algorithmus an 10 Konstruktion des Syntaxbaumes Erkennungsalgorithmus durchläuft nur den Ausdruck und erkennt ihn gibt accept oder reject aus erzeugt keine weitere Ausgabe Konstruktionsanweisungen für den Syntaxbaum müssen an den entsprechenden Stellen im Algorithmus hinzugefügt werden Veränderungen gegenüber der konkreten Syntax: Operatoren als innere Knoten Operanden als Kinder des Knotens Symbole des Eingabealphabetes und leere Kette als terminale Knoten class TreeNode Grundstruktur { String info; TreeNode left; TreeNode right; © Karin Haenelt, 11 } Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 Ein Parsebaum und Syntaxbaum (a|b)*abb Syntaxbaum Parsebaum E ( E P | P T T a b ● P T • T • T • T ) * a b b © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 ● ● ● * | a # b b a b 12 Vielen Dank Für das Aufspüren von Fehlern in früheren Versionen und für Verbesserungsvorschläge danke ich Victor Gabriel Saiz Castillo, Robert Schumann © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 13 Literatur Aho, Alfred V.; Sethi, Ravi und Jeffrey D. Ullman (1986). Compilers. Principles, Techniques and Tools. Addison-Wesley Publishing Company. Hopcroft, John E. und Jeffrey D. Ullman (1988). Einführung in die Automatentheorie, formale Sprachen und Komplexitätstheorie. Bonn u. a.: Addison-Wesley, 1988 (engl. Original Introduction to automata theory, languages and computation). Hopcroft, John E., Rajeev Motwani und Jeffrey D. Ullman (2002). Einführung in die Automatentheorie, Formale Sprachen und Komplexität. Pearson Studium engl. Original: Introduction to Automata Theory, Languages and Computation. Addison-Wesley. wwwdb.stanford.edu/~ullman/ialc.html © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 14 Versionen 25.04.2009 06.05.2008, 05.05.2007 27.05.,20.05.2005 © Karin Haenelt, Parsing regulärer Ausdrücke 25.4.2009, 1 22.5.2005 15