Vorlesung Programmieren 14 Parsen, Suchen und Sortieren 19./26.01.2015 Prof. Dr. Ralf H. Reussner Version 1.0 LEHRSTUHL FÜR SOFTWARE-DESIGN UND QUALITÄT (SDQ) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD), FAKULTÄT FÜR INFORMATIK sdq.ipd.kit.edu KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu
Erinnerung: Wichtige Termine Programmieren Übungsschein: Anmeldungszeitraum zwischen und 30.01.2015 Programmieren Abschlussaufgaben: Anmeldungszeitraum zwischen 02.02.2015 und 13.02.2015 Anmeldung jeweils über das Campus Management Portal : https://campus.studium.kit.edu/ 2
Parsen Fragestellung: Wie kann ein String in seine semantisch bedeutsamen Teile zerlegt und seine Struktur festgestellt werden? Beispiele: 13 + 4 * 52.5 13 + 4 * 52.5 Dies ist ein Beispiel. Dies ist ein Beispiel. Subj. Präd. Obj. class List { int x;... class List { int x ;... Idee: Verwende formale Sprachen und (kontextfreie) Grammatiken! 13 + 4 * 52.5 3
Beispiel: Taschenrechner Symbole: Terminalsymbole für Grundrechenarten, Klammern, Zahlen Nonterminalsymbol: E (für expression) Grammatik: (erster Versuch) E E + E E - E E * E E / E ( E ) z Problem: Struktur (wie Punkt-vor-Strich) geht verloren! Grammatik: (zweiter Versuch) Expr Term + Expr Term - Expr Term Term Fact * Term Fact / Term Fact Fact ( Expr ) z 4
Beispiel Taschenrechner: Parsebaum Expr Term + Expr Term - Expr Term Term Fact * Term Fact / Term Fact Fact ( Expr ) z 13 + 4 * 52.5 Expr Term + Expr Fact Term z Fact * Term z Fact z 5
Top-Down Parsen Wie können wir anhand der Grammatik einen Parser programmieren? Top-Down / Recursive-Descent ( Rekursiver Abstieg ) Parser Bottom-Up Parser Wir wollen einen Top-Down-Parser erstellen Ausgehend vom Startsymbol bestimme die nächste anzuwendende Regel Verwende Look-Ahead-Symbol Grammatik-Transformation (Links-Faktorisierung) erforderlich: Expr Term + Expr Term - Expr Term Term Fact * Term Fact / Term Fact Fact ( Expr ) z wird zu Expr Term RExp RExp + Expr - Expr ε Term Fact RTrm RTrm * Term / Term ε Fact ( Expr ) z Jetzt kann anhand des nächsten zu lesenden Zeichens die anzuwendende Regel eindeutig bestimmt werden (LL(1)-Sprache) 6
Recursive Descent Parser: Hilfsfunktionen Wir verwenden die Java StreamTokenizer-Klasse zur lexikalischen Analyse 13 + 4 * 52.5 Implementierung (Hilfsfunktionen): class Calculator { private int lookahead; private StreamTokenizer tokenizer; private void next() throws IOException { lookahead = tokenizer.nexttoken(); private void match(int expected) throws IOException, ParseException { if (lookahead!= expected) { throw new ParseException("unexpected token"); else { next();... 13 + 4 * 52.5 Token TT_EOF, TT_NUMBER, TT_WORD 7
Rekursiver Abstieg: Umsetzung Regeln (I) // Expr Term + Expr Term - Expr Term private void parseexpr() throws IOException, ParseException { parseterm(); if (lookahead == '+' lookahead == '-') { next(); parseexpr(); // Term Fact * Term Fact / Term Fact private void parseterm() throws IOException, ParseException { parsefact(); if (lookahead == '*' lookahead == '/') { next(); parseterm(); 8
Rekursiver Abstieg: Umsetzung Regeln (II) // Fact ( Expr ) z private void parsefact() throws IOException, ParseException { if (lookahead == '(') { match('('); parseexpr(); match(')'); else if (lookahead == StreamTokenizer.TT_NUMBER) { next(); else { error("unexpected symbol"); Demo! 9
Zusammenfassung Parsen Parsen: Struktur eines Textes erkennen Zwei große Klassen von Parsern: Top-Down Bottom-Up Vorgehensweise zur Erstellung eines Top-Down-Parsers: Grammatik erstellen Evtl. Grammatik-Transformationen Implementierung jeder Regel in einer Methode Für komplexere Grammatiken: verwende Parser-Generator ANTLR, JavaCC,... Für einfache (reguläre) Sprachen: verwende Automaten / reguläre Ausdrücke Mehr zu Parsern in der Vorlesung Compilerbau 10
Suchen, Sortieren Zu Suchen: Lineare Suche, Binäre Suche Sortieren: Bubblesort, Selectionsort, Insertionsort, Quicksort, Mergesort siehe Folien Pretschner (Wintersemester 2011/12) 11
Video: The Sound of Sorting Von Timo Bingmann (Mitarbeiter AG Sanders) entwickelt Sicht- und hörbar gemachte Algorithmen: Selection Sort Insertion Sort Quick Sort Merge Sort YouTube: Sound of Sorting 12