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

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

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

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)

Lösungvorschlag zum Übungsblatt 6: Software-Entwicklung I (WS 2007/08)

Inhalt Kapitel 11: Formale Syntax und Semantik

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:

Klausur Programmierung WS 2002/03

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 4 (Kapitel 4)

1. Probeklausur (Lösung) zu Programmierung 1 (WS 07/08)

Einführung in die funktionale Programmierung

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 17 (Best of)

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

Musterlösung zur 2. Probeklausur Directors Cut TM Programmierung 1 Wintersemester 2012/13

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Aufgabe 1 Basiswissen zur Vorlesung (8 Punkte)

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 5 (Kapitel 6)

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 9 (Dynamische und Statische Semantik)

Vorsicht bei redundanten und unvollständigen Matches!

Konzepte von Programmiersprachen

Musterlösung zur 1. Probeklausur Programmierung 1 Wintersemester 2012/13

Allgemeine Hinweise:

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 7 (Kapitel 7)

Berechnungsschemata: Funktion als Parameter abstrahiert Operation im Schema, wird bei Aufruf des Schemas konkretisiert

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 13 (Queues, Binary Search)

Inhalt Kapitel 5: Funktionen höherer Ordnung

Lösungshinweise/-vorschläge zur Altklausur Abschlussklausur 06/07

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Prüfung Funktionale Programmierung

Lösungen zum Übungsblatt 3: Softwareentwicklung I (WS 2006/07)

Programmierung und Modellierung

Programmierung und Modellierung

Grundprinzipien der funktionalen Programmierung

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 7 (Kapitel 7)

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 4 (Sortieren und Konstruktoren)

Programmierung und Modellierung

So schreiben Sie ein Parser-Programm

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 6 (Kapitel 06)

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 11 (Kapitel 12)

2. Probeklausur zur Vorlesung Programmierung 1 im Wintersemester 2011/2012

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Paradigmen der Programmierung

Einführung in Haskell

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine WWW

Praktikum Funktionale Programmierung Organisation und Überblick

Programmierung und Modellierung

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

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 1 (Kapitel 1)

Programmierung und Modellierung

Programmierung und Modellierung

Kapitel 6: Typprüfung

1. Probeklausur Programmierung 1 (WS 2010/2011)

Thomas Behr. 17. November 2011

ALP I. Funktionale Programmierung

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

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

Einführung in die Informatik 2

Schwerpunkte. 5. Auswahl: Bedingte Anweisungen. Syntax. If-Anweisung: Auswahl aus zwei Alternativen. If-Anweisung: Auswahl aus 2 Alternativen

Semantik komparierter Adjektive

3.1.4 Benutzerdefinierte Datentypen

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

Fahrplan. Algebraische Datentypen. Inhalt. Der Allgemeine Fall: Algebraische Datentypen. Algebraische Datentypen: Nomenklatur

Kapitel 6. Konstruktortypen und Ausnahmen. 6.1 Varianten und Konstruktoren

Einführung in die funktionale Programmierung

Anwendung (2. Versuch:-) Entkopplung der Locks

Funktionale Programmierung mit ML

Funktionale Programmierung

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

Synchronisation der restlichen Eingabe mit der Grammatik Parser kennt an jeder Stelle alle gültigen Nachfolge-Symbole Aufwendig

DEPENDABLE SYSTEMS AND SOFTWARE Fachrichtung 6.2 Informatik Prof. Dr.-Ing. Holger Hermanns

- Welche konkreten Invarianten müssen gelten? Berücksichtigen: Invarianten aus Modell und Implem.

Programmieren in Haskell

Programmierung 1 Probeklausur zur Vorklausur

Frank eine Programmiersprache mit Effekten

Lösungshinweise/-vorschläge zum Übungsblatt 2: Grundlagen der Programmierung (WS 2018/19)

Compilerbau. Martin Plümicke WS 2018/19

Proseminar: Fortgeschrittene Programmierung 1

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

Grundlagen der Programmierung 2. Operationale Semantik

Inhaltsverzeichnis. 1 Polynomordungen [9 Punkte] 2. 2 System F [9 Punkte] 3. 3 Strukturelle Induktion und Folds [9 Punkte] 4

Prüfung Funktionale Programmierung

Kapitel 3. Funktionale Programmierung in OCAML. Informatik I WS03/04 Martin Hofmann 90

Übungsblatt 6: Softwareentwicklung I (WS 2006/07)

Imperative und funktionale Sprachen

17. Rekursion 2. Bau eines Taschenrechners, Ströme, Formale Grammatiken, Extended Backus Naur Form (EBNF), Parsen von Ausdrücken

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1

VU Software Paradigmen / SS 2015

Induktion nach der Länge n von x

Praktische Informatik 3: Funktionale Programmierung Vorlesung 3 vom : Algebraische Datentypen

Grundlagen der Programmierung 2 (2.A)

1. Probeklausur zur Vorlesung Programmierung 1 im Wintersemester 2011/2012

Adressen. Praktikum Funktionale Programmierung Organisation und Überblick. Termine. Studienleistung

Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 5A. Lösung zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler)

Grundlagen der Programmierung 2 A (Listen)

LR: Syntax. Semantik und Analyse von Funktionalen Programmen (SAFP): LR: Reduktions-Regeln. LR: Reduktions-Regeln

Ausblicke zu Rekursiven Datenstrukturen

Transkript:

U N S A R I V E R S A V I E I T A S N I S S Programmierung WS 2002 / 03: Musterlösung zum 12. Übungsblatt Prof. Dr. Gert Smolka, Dipl.-Inform. Thorsten Brunklaus Aufgabe 12.1: Syntaxbäume (10 = 2 + 2 + 3 2) (a) at at at at at "(" "bool" "->" "int" "->" "bool" ")" "->" Es gibt genau einen Syntaxbaum, denn die Grammatik ist eindeutig. (b) "int" "3" "*" "(" "2" "*" "y" "+" "x" ")" "*" Es gibt genau drei Syntaxbäume, entweder beginnend mit dem obersten, oder. "z" 1

(c) "2" "+" "3" "-" "4" "+" "7" "2" "+" "3" "-" "4" "+" "7" "2" "+" "3" "-" "4" "+" "7" 2

Aufgabe 12.2: Mehrdeutige Grammatik (6 = 2 + 4) (a) (i) (b) (ii) "x" "x" "x" "x" "x" "x" = "x" "x" Aufgabe 12.3: Zeichendarstellung von Typen (8) fun (Arrow(t,t )) = at t ^ "->" ^ t t = at t and at Bool = "bool" at Int = "int" at t = "(" ^ t ^ ")" Aufgabe 12.4: Zeichendarstellung von Ausdrücken (10) fun (Op(e,Leq,e )) = e ^ "<=" ^ e e = e and (Op(e,Add,e )) = e ^ "+" ^ e (Op(e,Sub,e )) = e ^ "-" ^ e e = e and (Op(e,Mul,e )) = e ^ "*" ^ e e = e and (Con n) = Int.toString n e = "(" ^ e ^ ")" 3

Aufgabe 12.5: Lexer und Parser für Typen mit Pfeil und Stern (20 = 6 + 6 + 8) (a) fun lex s = lex nil (String.lode s) (b) and lex ts nil = rev ts lex ts (#"i" :: #"n" :: #"t" ::rs) = lex (INT::ts) rs lex ts (#"-" :: #">" ::rs) = lex (ARROW::ts) rs lex ts (#"*"::rs) = lex (STAR::ts) rs lex ts (#"("::rs) = lex (LPAR::ts) rs lex ts (#")"::rs) = lex (RPAR::ts) rs lex ts cs = raise Error = s [ "->" ] s = a [ "*" s ] a = "int" "(" ")" "->" s "*" a "int" "(" ")" (c) (* *) = s [ "->" ] s = a [ "*" s ] s = a [ "*" s ] a = "int" "(" ")" fun match (a,ts) t = if null ts orelse hd ts <> t then raise Error else (a, tl ts) fun combine a ts p f = let val (a,tr) = p ts in (f(a,a ), tr) end 4

fun ts = (case s ts of (t, ARROW::tr) => combine t tr (fn (t, t ) => Arrow(t, t )) sts => sts) and s ts = (case a ts of (t, STAR::tr) => combine t tr s (fn (t, ts) => Star (t :: ts)) sts => sts) and s ts = (case a ts of (t, STAR::tr) => combine t tr s (fn (t, ts) => (t :: ts)) (t, tr) => ([t], tr)) and a (INT::tr) = (Int, tr) a (LPAR::tr) = match ( tr) RPAR a _ = raise Error fun parse ts = (case ts of (t, nil) => t _ => raise Error) Aufgabe 12.6: Kontextfreie Syntax von applikativen Ausdrücken (16 = 4 4) (a) = [ ] = "(" ")" (b) fun (App(e,e )) = e ^ " " ^ e e = e and (Id s) = s e = "(" ^ e ^ ")" (c) = ap ap = [ ap ] = "(" ")" ap "(" ")" 5

(d) fun ts = ap ( ts) and (ID _::ts) = ts (LPAR::ts) = (case ts of RPAR::tr => tr _ => raise Error) _ = raise Error and ap (ID _::tr) = ap tr ap (LPAR::tr) = ap ( (LPAR::tr)) ap tr = tr and test ts = ( ts = nil) handle Error => false Aufgabe 12.7: Lexer und Parser für Ausdrücke mit Cons und Append (30 = 10 + 6 + 4 + 10) (a) fun lex ts nil = rev ts lex ts (#" " ::cs) = lex ts cs lex ts (#"\n"::cs) = lex ts cs lex ts (#"\t"::cs) = lex ts cs lex ts (#":" :: #":" ::cs) = lex (CONS::ts) cs lex ts (#"@" ::cs) = lex (APPEND::ts) cs lex ts (#"(" ::cs) = lex (LPAR::ts) cs lex ts (#")" ::cs) = lex (RPAR::ts) cs lex ts (c ::cs) = if Char.isAlpha c then lexa ts [c] cs else raise Error (b) and lexa ts xs cs = if not(null cs) andalso Char.isAlphaNum(hd cs) then lexa ts (hd cs::xs) (tl cs) else lex (ID(implode(rev xs)) :: ts) cs fun lex s =lex nil (lode s) = ap [ ("::" "@") ] ap = [ ap ] = "(" ")" "::" "@" ap "(" ")" 6

(c) = ap [ ("::" "@") ] ap = ap ap = [ ap ] = "(" ")" "::" "@" ap ap "(" ")" (d) (* = ap [ ("::" "@") ] ap = ap ap = [ ap ] = "(" ")" *) datape opr = Cons Append datape = Id of string Op of * opr * App of * fun match (a,ts) t = if null ts orelse hd ts <> t then raise Error else (a, tl ts) fun combine a ts p f = let val (a,tr) = p ts in (f(a,a ), tr) end fun opa opr (a,a ) = Op(a,opr,a ) 7

fun firstat (ID _ ::_) = true firstat (LPAR ::_) = true firstat _ = false fun ts = case ap ts of (a, CONS ::tr) => combine a tr (opa Cons) (a, APPEND::tr) => combine a tr (opa Append) ats => ats and ap ts = ap ( ts) and ap (a,ts) = if firstat ts then ap (combine a ts App) else (a,ts) and (ID s ::ts) = (Id s, ts) (LPAR ::ts) = match ( ts) RPAR _ = raise Error fun parse ts = case ts of (a, nil) => a _ => raise Error 8