Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

PSS Gedächtnisprotokoll Klausur WS0910: Unterschied zwischen den Versionen

(Aufgabe 3 (6 Punkte))
 
(7 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 11: Zeile 11:
 
== Aufgabe 2 (13 Punkte) ==
 
== Aufgabe 2 (13 Punkte) ==
  
Absy (2 Punkte) und Parser (11 Punkte) für Java Methodenaufrufe
+
Absy (2 Punkte) und Parser ohne Fehlerbehandlung (11 Punkte) für Java Methodenaufrufe
  
 
Beispielsatz: x.f(y.g(y,a),b)
 
Beispielsatz: x.f(y.g(y,a),b)
Zeile 25: Zeile 25:
 
Gegeben war:
 
Gegeben war:
  
   DATA absy == where(e1:Expr, ide:denotation, e2:Expr)
+
   DATA Expr == where(e1:Expr, ide:denotation, e2:Expr)
                              ...
+
              ...
  
 
  FUN typecheck : expr ** env -> result
 
  FUN typecheck : expr ** env -> result
  
 
  DATA result == avail(t:Type)
 
  DATA result == avail(t:Type)
              nil
+
                nil
  
 
und die Lambda Kalkül Regel:
 
und die Lambda Kalkül Regel:
Zeile 39: Zeile 39:
 
  gamma |- where(e1:t1, v:t2, e2:t2) : t1
 
  gamma |- where(e1:t1, v:t2, e2:t2) : t1
  
== Aufgabe 4 (etwa 7 Punkte) ==
+
== Aufgabe 4 (7 Punkte) ==
  
 
Unifikation:
 
Unifikation:
Zeile 48: Zeile 48:
 
  DEF f == \\s. filter(lengthOne)(s)
 
  DEF f == \\s. filter(lengthOne)(s)
  
Baum für f (als Abstraktion) war angegeben und korrekt.
+
Baum für f (als Abstraktion) war vorgegeben und musste auf Typkorrektheit geprüft werden.  D.h. Typgleichungen angeben und Unifikation durchführen.
  
 
== Aufgabe 5 (7 Punkte) ==
 
== Aufgabe 5 (7 Punkte) ==
Zeile 54: Zeile 54:
 
SECD ausführen für den Ausdruck:  (\\x.add(x 2))(4)
 
SECD ausführen für den Ausdruck:  (\\x.add(x 2))(4)
  
== Aufgabe 6 (6 Punkte) ==
+
== Aufgabe 6 (4+1+1 = 6 Punkte) ==
  
 
1) Stack Machine Code für Funktion generieren:
 
1) Stack Machine Code für Funktion generieren:
Zeile 73: Zeile 73:
  
 
3) 2 Varianten von Code für einen mathematischen Ausdruck war vorgegeben.  Einmal naive Variante, einmal mit dem tieferen Baum zuerst ausgeführt.  Gefragt war welche Variante besser ist.
 
3) 2 Varianten von Code für einen mathematischen Ausdruck war vorgegeben.  Einmal naive Variante, einmal mit dem tieferen Baum zuerst ausgeführt.  Gefragt war welche Variante besser ist.
 +
 +
== Mögliche Lösungen ==
 +
 +
== Aufgabe 3 ==
 +
 +
DATA Expr == where(e1:Expr, ide:denotation, e2:Expr)
 +
 +
 +
FUN typecheck : expr ** env -> result
 +
 +
 +
DATA result == avail(t:Type)
 +
                nil
 +
 +
 +
DEF typecheck(where(expr1,name,expr2), envi )==
 +
LET
 +
result1 == typecheck(expr2,envi)
 +
IN
 +
IF result1 nil? THEN
 +
result1
 +
ELSE
 +
typecheck(expr1,def(name,t(result1),envi))
 +
                FOO

Aktuelle Version vom 28. Februar 2012, 17:49 Uhr

Aufgabe 1 (11 Punkte)

E -> E + A 
   | E - A 
   | A
A -> ( E ) 
   | ide

Grammatik umformen und originale und umgeformte Grammatiken auf LL(1) prüfen (mit DirectorSets)

Aufgabe 2 (13 Punkte)

Absy (2 Punkte) und Parser ohne Fehlerbehandlung (11 Punkte) für Java Methodenaufrufe

Beispielsatz: x.f(y.g(y,a),b)

Originale und umgeformte Grammatiken waren vorgegeben, aber ohne semantische Aktionen

Falls Kombinatorparser, musste man die Standardkombinatoren ( ; | ), read, shift, usw. nicht hinschreiben

Aufgabe 3 (6 Punkte)

Typcheck von where-Ausdruck: (...) where (v == ...)

Gegeben war:

 DATA Expr == where(e1:Expr, ide:denotation, e2:Expr)
              ...
FUN typecheck : expr ** env -> result
DATA result == avail(t:Type)
               nil

und die Lambda Kalkül Regel:

gamma, v:t2 |- e1:t1 , gamma |- e2:t2
--------------------------------------
gamma |- where(e1:t1, v:t2, e2:t2) : t1

Aufgabe 4 (7 Punkte)

Unifikation:

FUN lengthOne : seq[alpha] -> bool
FUN filter : (alpha -> bool) ** seq[alpha] -> seq[alpha]
DEF f == \\s. filter(lengthOne)(s)

Baum für f (als Abstraktion) war vorgegeben und musste auf Typkorrektheit geprüft werden. D.h. Typgleichungen angeben und Unifikation durchführen.

Aufgabe 5 (7 Punkte)

SECD ausführen für den Ausdruck: (\\x.add(x 2))(4)

Aufgabe 6 (4+1+1 = 6 Punkte)

1) Stack Machine Code für Funktion generieren:

int f(n) {
 if(n < 2) {
   return n;
 } else {
   return 3 * f(n - 2);
 }
}

Angegeben war Pseudocode-Befehle wie load<n>, lt, ret, goto-on-false L, mul, sub, call L

2) 2 Varianten von Code für eine while-Schleife angegeben: einmal Naive Variante und einmal aus der VL Besprochene Optimierung

Gefragt war welche Variante besser war.

3) 2 Varianten von Code für einen mathematischen Ausdruck war vorgegeben. Einmal naive Variante, einmal mit dem tieferen Baum zuerst ausgeführt. Gefragt war welche Variante besser ist.

Mögliche Lösungen

Aufgabe 3

DATA Expr == where(e1:Expr, ide:denotation, e2:Expr)


FUN typecheck : expr ** env -> result


DATA result == avail(t:Type)
               nil


DEF typecheck(where(expr1,name,expr2), envi )== 
		LET
		result1 == typecheck(expr2,envi)
		IN
		IF result1 nil? THEN
		 	result1
		ELSE
		typecheck(expr1,def(name,t(result1),envi))
               FOO