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 WS 0506: Unterschied zwischen den Versionen

(nicht umgeformte -> ursprüngliche)
Zeile 60: Zeile 60:
  
 
2. Erläutere den Stackframe (überlappung und sowas)
 
2. Erläutere den Stackframe (überlappung und sowas)
 +
  
 
== Aufgabe 5: Unifikation ==
 
== Aufgabe 5: Unifikation ==
 +
1. Stelle die Gleichungen auf
 +
 +
<pre>
 +
FUN _ o _ : (beta -> gamma) -> (alpha -> beta) -> (alpha -> beta)
 +
FUN length: string -> nat
 +
FUN even?: nat -> bool
  
FUN _ o _ : (beta -> gamma) -> (alpha -> beta) -> (alpha -> beta)
+
FUN h: string -> bool
FUN length: string -> nat
+
DEF h(s) == o(even?)(length)(s)
FUN even?: nat -> bool
 
  
FUN h: string -> bool
 
DEF h(s) == o(even?)(length)(s)
 
  
apply (tau1)
+
apply(tau1)
apply(tau2) s (tau3)
+
apply(tau2)
apply(tau4) length(tau5)
+
apply(tau4)
o(tau6) even?(tau7)
+
o(tau6)
 +
even?(tau7)
 +
length(tau5)
 +
s (tau3)
 +
</pre>
 +
Zur Notation: Erst kommt ein Knoten, dann seine Kinder von links nach rechts
 +
Der Baum gehört zu h und ist korrekt.

Version vom 13. Februar 2006, 20:51 Uhr

Hier fehlen ggf. noch ein paar Informationen, mein Gedächtnis ist da etwas lückenhaft!


Aufgabe 1: Grammatikumformung

1. Forme die Grammatik so um, dass sie von einem recursive-descent-Parser geparst werden kann.

2. Entscheide und begründe, ob die umgeformte Grammatik und die ursprüngliche Grammatik die LL(1)-Eigenschaft erfüllen. Bilde die nötigen First-, Follow- und Directormengen.

S  -> E#
E  -> ide
   |  ide ( A )
A  -> P
   |  {Epsilon}
P  -> P , E
   |  E

Aufgabe 2: Parser

DATA absy == node(val:seq[absy]) leaf(val:token)

Gegeben folgende Grammatik mit Directormenge:

S  ->  T #
T  ->  ide
       <T T'>
T' ->  {Epsilon}
    |  _ T T' {Das _ war ein space}

Ein Wort der Sprache war: <<1 2 4> <1 4 5> 3> Das ganze repräsentierte einen n-ären Baum

DATA token ==
	Open
	Close
	space
	id(val:int)
	eof

1. Entwickle einen passenden Absy.

2. Schreibe einen Recursive-Descent-/Combinator-Parser ohne Fehlerbehandlung. Falls Combinator: Programmiere auch die Kombinatoren.

Aufgabe 3: SECD

(\x. x(2))(\y. dup(y))

Ergebnis 4

dup ist eine triviale Operation.

Aufgabe 4: Codeerzeugung

int f(x:int, y:int){
	if(x==0)
		return y
	else
		return f(x-1, x*y)
}

1. Erzeuge Pseudocode für eine abstrakte stackbasierte Maschine.

2. Erläutere den Stackframe (überlappung und sowas)


Aufgabe 5: Unifikation

1. Stelle die Gleichungen auf

FUN _ o _ : (beta -> gamma) -> (alpha -> beta) -> (alpha -> beta)
FUN length: string -> nat
FUN even?: nat -> bool

FUN h: string -> bool
DEF h(s) == o(even?)(length)(s)


apply(tau1)
	apply(tau2)
		apply(tau4)
			o(tau6)
			even?(tau7)
		length(tau5)
	s (tau3)

Zur Notation: Erst kommt ein Knoten, dann seine Kinder von links nach rechts Der Baum gehört zu h und ist korrekt.