PSS Gedächtnisprotokoll Klausur WS 0506: Unterschied zwischen den Versionen
(aufgabe 1) |
|||
| Zeile 3: | Zeile 3: | ||
---- | ---- | ||
<pre> | <pre> | ||
| − | 1. | + | 1. |
| − | + | gegebene grammatik: | |
| − | S -> E# | + | S -> E # |
| − | E -> ide | + | E -> ide |
| − | + | | ide ( A ) | |
| − | A -> P | + | A -> P |
| − | + | | | |
| − | P -> P , E | + | P -> P , E |
| − | + | | E | |
| + | |||
| + | |||
| + | 1.1 | ||
| + | forme die grammatik so um, dass sie für einen | ||
| + | top-down-parser geignet ist (--> LL(1)). | ||
| + | |||
| + | 1.2 | ||
| + | direktormengen aufstellen. | ||
| + | für die alte und die neue grammatik. | ||
| + | |||
| + | |||
| + | 2. | ||
| + | schreibe einen recursive-decent-parser (combinator/hand) | ||
| + | ohne fehlerbehandlung für die grammatik: | ||
| + | |||
| + | S -> T # | ||
| + | T -> < T T' > | ||
| + | T' -> ide | ||
| + | | | ||
| + | |||
| + | ??? | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
in der sprache war: <<1 2 4> <1 4 5> 3> | in der sprache war: <<1 2 4> <1 4 5> 3> | ||
das ganze repräsentierte einen n-ären baum | das ganze repräsentierte einen n-ären baum | ||
| Zeile 28: | Zeile 44: | ||
Close | Close | ||
space | space | ||
| − | id(val: | + | id(val:int) |
3. SECD | 3. SECD | ||
Version vom 13. Februar 2006, 20:27 Uhr
Hier fehlen noch ein paar Informationen, mein Gedächtnis ist da etwas lückenhaft! Außerdem scheint mir einiges falsch..? naja vorallem die 2. Grammatik ist nicht identisch
1.
gegebene grammatik:
S -> E #
E -> ide
| ide ( A )
A -> P
|
P -> P , E
| E
1.1
forme die grammatik so um, dass sie für einen
top-down-parser geignet ist (--> LL(1)).
1.2
direktormengen aufstellen.
für die alte und die neue grammatik.
2.
schreibe einen recursive-decent-parser (combinator/hand)
ohne fehlerbehandlung für die grammatik:
S -> T #
T -> < T T' >
T' -> ide
|
???
in der sprache war: <<1 2 4> <1 4 5> 3>
das ganze repräsentierte einen n-ären baum
DATA absy ==
node(val:seq[absy])
leaf(val:token)
DATA token ==
Open
Close
space
id(val:int)
3. SECD
(\x. x(2))(\y. dup(y))
ergebnis 4
dup ist triviale operation
4. codeerzeugung
int f(x:int, y:int){
if(x==0)
return y
else
return f(x-1, x*y)
}
erzeuge pseudocode für eine stackartige maschine
erläutere den stackframe (überlappung und sowas)
5. unifikation
length: string -> nat
even?: nat -> bool
h: string -> ???
h(s) == ???
eval
eval s
eval length
??? even?
ergebnis war korrekt, aber das sah vllt. auch etwas anders aus..