Die folgende Grammatik G über dem Alphabet Σ = {w, f, u, i} soll Ausdrücke mit den Konstanten w, f und den binären Operatoren u, i beschreiben:
Gesucht ist eine zu G äquivalente eindeutige kontextfreie Grammatik G', für deren Ableitungsbäume gilt: der Operator u ist linksassoziativ, der Operator i ist rechtsassoziativ, der Operator u bindet stärker als der Operator i.
Wie sieht unter diesen Bedingungen
der abstrakte Syntaxbaum für
fiwufiw aus?
Untersuchen Sie, ob G1, G2, G3 die gewünschten Eigenschaften erfüllen. (Falls nein: begründen, falls ja: konkreten Syntaxbaum für fiwufiw angeben.)
while (P) { A; if (Q) { B; } C; }Das Spur-Alphabet ist {A, B, C, P0, P1, Q0, Q1}, dabei bedeuten
Nach welcher Regel bestimmt man,
ob ein Ausdruck f(x)
korrekt getypt ist?
(Ohne Berücksichtigung von Vererbung oder Generizität.)
f
den Typ ... hat
x
den Typ ... hat,
f(x)
... .
Wie werden die folgenden Operationen für Typen in Programmiersprachen realisiert?
In Java gibt es keine direkte Realisierung der Vereinigung,
was wird stattdessen empfohlen?
Für das Ada-Programm:
with Ada.Text_Io; use Ada.Text_Io; procedure Main is X : Integer := 3; Y : Integer := 2; procedure P (X : Integer) is procedure Q (Y : Integer) is procedure R (X : Integer) is begin Put_Line (Integer'Image (X+Y)); end R; begin if Y > 0 then P(X-1); else R(X+Y); end if; end Q; begin if X > 0 then Q(X-1); else P(X-Y); end if; end P; begin P (X-1); end Main;
Zeichnen Sie die Frames mit allen Einträgen und Verweisen
zu dem Zeitpunkt direkt vor dem ersten Aufruf von Put_Line
.
Wie wird auf die Werte von X
und Y
zugegriffen,
die in Integer'Image(X+Y)
benötigt werden?
Für folgende Deklaration:
int a [] = { 1,2,0 }; void p (int x, int y) { a[y] = x; x = y; }betrachten wir den Aufruf
p(a[0], a[1])
.
Geben Sie die Ausführungsschritte sowie die resultierende Speicherbelegung an, falls zur Parameterübergabe benutzt wird:
class C { } class D extends C { } static void p (Object x, C y) { System.out.println ("1"); } static void p (D x, C y) { System.out.println ("2"); } static void p (C x, Object y) { System.out.println ("3"); }Beschreiben Sie, wie die Überladung für die folgenden Aufrufe aufgelöst wird:
p (new D(), new D());
p (new C(), new C());
Johannes Waldmann 2013-01-28