Proseminar: Fortgeschrittene Programmierung 1

Ähnliche Dokumente
So schreiben Sie ein Parser-Programm

Funktionale Programmierung und Typtheorie

Programmieren in Haskell

Programmieren in Haskell Einstieg in Haskell

Programmieren in Haskell

Rekursive Abstiegsparser sind durch gegenseitig rekursive Funktionen - eine für jedes Nichtterminalsymbol der Grammatik - definiert.

Praktische Informatik 3: Funktionale Programmierung Vorlesung 11 vom : Monaden als Berechnungsmuster

Grundlagen der Programmierung 2 (Comp-C)

Inhalt Kapitel 11: Formale Syntax und Semantik

Grundlagen der Programmierung 2 (Comp-C)

Compilerbau. Martin Plümicke WS 2018/19

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur -

Grundlagen der Programmierung

Syntaktische Analyse (Parsen) Grundlagen der Programmierung. Syntaktische Analyse eines Programms. Syntaktische Analyse bzgl einer CFG

Paradigmen der Programmierung

Grundlagen der Programmierung 3 A

Lexikalische Analyse, Tokenizer, Scanner

WS 2012/2013. Robert Giegerich. 21. November 2012

Lex und Yacc Lt. Worf, scannen Sie das Schiff! 300dpi, Sir?

Einführung in die funktionale Programmierung

Praktische Informatik 3

Definition Compiler. Bekannte Compiler

2.2 Syntax, Semantik und Simulation

Ein Fragment von Pascal

Praktikum Funktionale Programmierung Teil 1: Lexen und Parsen

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz

Phasen eines Compilers. Grundlagen der Programmierung 2. Programm für heute. LR-Parser, Shift-Reduce-Verfahren. Schiebe-Reduziere-Parser

Programmieren in Haskell Programmiermethodik

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 11 (Parser II)

Funktionale Programmierung. Monaden. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Einführung in die Informatik Übung

Funktionale Programmierung. ALP I Lambda-Kalkül. Teil III SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Fachseminar Compilerbau

Einführung in die Informatik 2

Funktionale Programmierung mit Haskell

Haskell for Hackers... or why functional programming matters

Workshop Einführung in die Sprache Haskell

Monadische Parser. Syntax-Analyse mit Haskell. Mathias Mierswa (winf2920) Thomas Stuht (inf6937) 8. Januar 2009

Lexikalische Programmanalyse der Scanner

Grundlagen der Programmierung 3 A

Funktionale Programmierung. ALP I Lambda-Kalkül. Teil IVb WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Prüfung Funktionale Programmierung

Grundlagen der Programmierung 2 (2.B)

ProInformatik: Funktionale Programmierung. Punkte

Grundlegende Datentypen

Höhere Funktionale Programmierung: Parser-Kombinatoren

ALP I Turing-Maschine

Beuth Hochschule Einführende Gentle-Programme WS12/13, S. 1

Musterlösung zur 2. Aufgabe der 4. Übung

Grundlegende Datentypen

ALP I. Funktionale Programmierung

Das erste C++ Programm

Grundlagen der Programmierung 2 (2.A)

Prüfung Funktionale Programmierung

ALP I Turing-Maschine

Funktionale Programmierung

Grundlagen der Programmierung 2 (Comp-A)

Binärbäume und Pfade

WS 2013/2014. Robert Giegerich. 11. Dezember 2013

WS 2013/2014. Robert Giegerich. 11. Dezember 2013

Vorsemesterkurs Informatik

Probeklausur Name: (c)

Grundlagen der Programmierung 2 A (Listen)

Abstrakte Syntax von Prolog (1)

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 4 -

Es gibt keinen Algorithmus zum Schreiben eines Programms bzw. Algorithmus.

Programmierung WS 2002 / 03: Musterlösung zum 12. Übungsblatt

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Informatik A WS 2007/08. Nachklausur

Syntaktische Analyse (Parsen)

II.1.1. Erste Schritte - 1 -

Grammatiken und ANTLR

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Stratego/XT und ASF+SDF Meta-Environment. Paul Weder Seminar Transformationen Datum:

9.4 Grundlagen des Compilerbaus

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Haskell in der Schule - (K)ein Thema? Ralf Dorn - Dennis Buchmann - Felix Last - Carl Ambroselli

Programmierparadigmen

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

Funktionale Programmierung Grundlegende Datentypen

Grundlegende Datentypen

WS 2011/2012. Robert Giegerich Dezember 2013

Prof. Dr. Uwe Schmidt. 12. August Aufgaben zur Klausur Softwaredesign im SS 2014 (BInf v310, BMInf v300, BWInf v310, BWInf- 23)

II.1.1. Erste Schritte - 1 -

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen

Programmierung 1 (Wintersemester 2015/16) Lösungsblatt: Aufgaben für die Übungsgruppen: 12 (Kapitel 13)

Einführung in die Programmierung für NF. Übung

Motivation Von Funktoren, Komposition, Applikation Zu Monoiden Die Monade Zusammenfassung. Monaden für alle. Franz Pletz

Programmierparadigmen Tutorium: Lazyness, Streams

Grundlagen der Programmierung 2 (Comp-A)

VL06: Haskell (Funktionen höherer Ordnung, Currying)

Funktionale Programmierung ALP I. λ Kalkül. Teil 2 WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

[05] Aufgabenblatt 3 [doch nicht :-]

Transkript:

Proseminar: Fortgeschrittene Programmierung 1 Parsen and Backtracking WS 2007 2008 Christian Wawrzinek

Übersicht 2 1.Grammatiken 2. Parser 3.Backtracking 4.Kombinatoren

Übersicht 3 1.Grammatiken 2. Parser 3.Backtracking 4.Kombinatoren

ein Beispiel 4 Start > Ausdruck Ausdruck > Term Ausdruck > Term "+" Ausdruck Term > Faktor Term > Faktor "*" Term Faktor > "X" Faktor > "(" Ausdruck ")"

ein Beispiel 5 Start => Ausdruck => Term '+' Ausdruck => Faktor '+' Ausdruck => 'X' '+' Ausdruck => 'X' '+' Term => 'X' '+' Faktor '*' Term => 'X' '+' 'X' '*' Term => 'X' '+' 'X' '*' '(' Ausdruck ')' =>... => 'X' '+' 'X' '*' '(' 'X' '+' 'X' ')'

Übersicht 6 1.Grammatiken 2. Parser 3.Backtracking 4.Kombinatoren

Was ist ein Parser? 7 Ist meistens Teil eines Compilers Besteht in der Regel aus 2 Phasen 1. Lexikalische Analyse 2. Syntaxanalyse

Lexikalische Analyse / scanning 8 entfernt Leerzeichen und Kommentare zerlegt Ausdrücke in logische Einheiten entfernt überflüssige Einrückungen

Syntaxanalyse 9 fasst Ausdrücke zu grammatikalischen Sätzen zusammen erstellt Syntax Baum

Syntax Bäume 10 Ein möglicher Syntax Baum für folgende Anweisung: * (3+7)*47 + 47 3 7

Übersicht 11 1.Grammatiken 2. Parser 3.Backtracking 4.Kombinatoren

Backtracking 12 Try and Error prinzip: d.h. es wird versucht, eine erreichte Teillösung schrittweise zu einer Gesamtlösung auszubauen. Wenn absehbar ist, dass eine Teillösung nicht zu einer endgültigen Lösung führen kann, wird der letzte Schritt bzw. die letzten Schritte zurückgenommen, und es werden stattdessen alternative Wege probiert.

Übersicht 13 1.Grammatiken 2. Parser 3.Backtracking 4.Kombinatoren

Kombinatoren 14 sind Funktionen, die andere Funktionen Transformieren z.b.: map Funktion auf werte > Funktion auf Listen map :: (a > b) > ([a] > [b]) z.b.: (+1) addiert 1 zu seinem Argument. map (+1) addiert 1 zu jedem Element in der Argumentliste Hugs> map (+1) [0,1,2] [1,2,3]

Der Parser type 15 type Parser_alg a b = [a] > [([a], b)] Zum besseren Verständnis nehmen diesen Spezialfall an: a = Char type Parser b = String > [(String, b)]

der 'X' Parser 16 überprüft ob der 1. Buchstabe eines Strings ein 'x' ist x :: Parser Char x ('x':rest) = [(rest, 'x')] x _ = []

der 'X' Parser 17 überprüft ob der 1. Buchstabe eines Strings ein 'x' ist: x :: Parser Char x ('x':rest) = [(rest, 'x')] x _ = [] Wenn ja, gibt er dieses und den Rest aus: Main> x "xhhhh" [("hhhh",'x')]

Primitiver Parser success 18 Liefert immer einen Erfolg mit dem angegebenen Wert success :: a > Parser a success wert string = [(string, wert)]

Primitiver Parser success 19 Liefert immer einen Erfolg mit dem angegebenen Wert success :: a > Parser a success wert string = [(string, wert)] Main> success ';' "bhuhu" [("bhuhu",';')]

Primitiver Parser fail 20 Fail ist ein Parser, der niemals einen Erfolg liefert fail :: Parser a fail _ = []

Primitiver Parser fail 21 Fail ist ein Parser, der niemals einen Erfolg liefert fail :: Parser a fail _ = [] Main> fail "bhuhu" []

Auswahl Kombinator 22 BNF: a ::= b c parser1 / / parser2 soll parser1 oder parser2 oder beide parsen lassen (/ /) :: Parser a > Parser a > Parser a (parser1 / / parser2) string = parser1 string ++ parser2 string

Auswahl Kombinator 23 Main> (/ /) x y "xhallo" [("Hallo",'x')] Parser 'X' Main> (/ /) x y "yhallo" [("Hallo",'y')] Parser 'Y' Main> (/ /) x y "zhallo" [] keiner von beiden

optional Kombinator 24 BNF: a ::= b <nichts> optional :: Parser a > a > Parser a optional p wert = p / / success wert Main> optional x 'z' "xhuhu" [("huhu",'x'),("xhuhu",'z')]

Verkettungs Kombinator 25 p1 / / p2 ist ein Parser, der zunächst p1 anwendet, dann p2 anwendet und beide Ergebnisse als Tupel zurückliefert. (/ /) :: Parser a > Parser b > Parser (a, b) (parser1 / / parser2) string = [ (rest2, (ret1, ret2)) (rest1, ret1) < parser1 string, (rest2, ret2) < parser2 rest1 ]

Verkettungs Kombinator 26 x / / y verlangt xy in der Eingabe, und liefert das Tupel ('x', 'y') zurück. Dieses kann mit dem modify Kombinator weiterverarbeitet werden.

modify Kombinator 27 Der modify Kombinator wendet eine Funktion fun auf die Ausgabe eines Parsers an: modify :: (a > b) > Parser a > Parser b modify fun parser string = [ (rest, fun a) (rest, a) < parser string ]

modify Kombinator 28 so wird aus: Main> p1 "1Hallo" [("Hallo",1)] Main> (modify (+1) p1) "1Hallo" [("Hallo",2)] Kann auch noch mit z.b.: many kombiniert werden: Main> many (modify (+1) p1) "11Hallo" [("Hallo",[2,2]),("1Hallo",[2]),("11Hallo",[])]

many Kombinator 29 BNF: vieleas ::= a vieleas vieleas ::= <nichts> ein a könnte man ableiten durch: vieleas => a vieleas (Regel 1) => a <nichts> = a many :: Parser a > Parser [a] many parser = viele / / keine where viele = modify tcons (parser / / many parser) tcons (x, xs) = x:xs keine = success []

many Kombinator 30 Der 'many' Kombinator gibt eine Liste mit allen möglichen Ableitungen zurück: Main> many x "xxxxhallo" [("Hallo","xxxx"),("xHallo","xxx"), ("xxhallo","xx"),("xxxhallo","x"), ("xxxxhallo","")]

rechts ignorieren 31 x /> / y parst ein x, das von einem y gefolgt sein muss. Das y trägt aber zum Rückgabewert nicht bei. (/> /) :: Parser a > Parser b > Parser a parser1 /> / parser2 = modify fst (parser1 / / parser2)

rechts ignorieren 32 Main> (x /> / y) "xyhuhu" [("huhu",'x')]

links ignorieren 33 p1 / >/ p2 wendet p1 und dann p2 an, und liefert die Rückgabe von p2. Die Rückgabe von p1 wird verworfen. (/ >/) :: Parser a > Parser b > Parser b parser1 / >/ parser2 = modify snd (parser1 / / parser2)

einfacher Parser mit Kombinatoren 34 data SyntaxBaum = SyntaxBaum Ausdruck deriving (Show) data Ausdruck = Ausdruck :* Ausdruck Ausdruck :+ Ausdruck X deriving (Show) start string = modify SyntaxBaum ausdruck

einfacher Parser mit Kombinatoren 35 ausdruck :: Parser Ausdruck ausdruck = term / / modify plusausdruck (term / / (char '+' / >/ ausdruck)) where plusausdruck (a1, a2) = a1 :+ a2

einfacher Parser mit Kombinatoren 36 term :: Parser Ausdruck term = faktor / / modify malausdruck (faktor / / (char '*' / >/ term)) where malausdruck (a1, a2) = a1 :* a2 faktor :: Parser Ausdruck faktor = modify (\_ > X) (char 'X') / / (char '(' / >/ (ausdruck /> / char ')'))