PSS Gedächtnisprotokoll Klausur WS 0506: Unterschied zwischen den Versionen
(aufgabe 1) |
(Weitergeführt, Design verändert) |
||
Zeile 1: | Zeile 1: | ||
− | Hier fehlen noch ein paar Informationen, mein Gedächtnis ist da etwas lückenhaft! | + | Hier fehlen ggf. noch ein paar Informationen, mein Gedächtnis ist da etwas lückenhaft! |
− | |||
− | |||
− | |||
− | |||
− | |||
− | S -> | + | |
− | E -> | + | == 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 nicht umgeformte Grammatik die LL(1)-Eigenschaft erfüllen. Bilde die nötigen First-, Follow- und Directormengen. | ||
+ | |||
+ | S -> E# | ||
+ | E -> ide | ||
| ide ( A ) | | ide ( A ) | ||
− | A -> | + | A -> P |
− | | | + | | {Epsilon} |
− | P -> | + | P -> P , E |
| 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''} | ||
− | 1 | + | 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. | + | 2. Schreibe einen Recursive-Descent-/Combinator-Parser ohne Fehlerbehandlung. Falls Combinator: Programmiere auch die Kombinatoren. |
− | |||
− | ohne | ||
− | + | == 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 == | ||
− | + | 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) s (tau3) | |
− | + | apply(tau4) length(tau5) | |
− | + | o(tau6) even?(tau7) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Version vom 13. Februar 2006, 20:37 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 nicht umgeformte 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
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) s (tau3) apply(tau4) length(tau5) o(tau6) even?(tau7)