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 h: string -> bool | |
| − | + | DEF h(s) == o(even?)(length)(s) | |
| − | |||
| − | |||
| − | |||
| − | + | apply(tau1) | |
| − | + | apply(tau2) | |
| − | + | apply(tau4) | |
| − | + | 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!
Inhaltsverzeichnis
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.