04.02.2015 * Grundlagen des Übersetzerbaus * 30 Minuten * Prüfer: Prof. Dr. Michael Philippsen * Beisitz: Marius Kamp M. Sc. * Papier und Stift bereitgestellt * Ein Blatt mit ausgedrucktem Code vorbereitet * Ein weiteres Blatt für die Anwendung von dynamischem Programmieren Gegebeber Code (beispielhaft!): int a[5][20]; // 1 int main() { int y; int fak() { // 2 int x = 1; if() { x += 17 } else { x -= 17 y = x * 5; // 3 return x; } } int x = y * 3; a[3][x] = fak(); // 4 } P: Was macht der Compiler bei 1? S: Lexer erklärt, Parser erklärt, Semantische Analyse (Typcheck, Symboltabelle) P: Malen Sie den AST zu 1. S: Ast hingemalt, wichtig: Variable wird hier noch nicht initialisiert. P: Man möchte innere Funktionen unterstützen, siehe 2. Was ist zu tun? S: Lexer muss nicht angepasst werden, Parser schon -> Funktionendeklaration in Blöcken muss möglich sein. AST verändert sich auch. Grammatik erweitert. P: Man möchte jetzt die Funktion rausziehen, also die Hierarchie flach machen. Was passiert bei 3? S: Variable y ist nicht mehr zugreifbar -> Referenz dazu muss her. P: Wo fügt man die in den Baum ein? Wie funkioniert das genau? Wie geht das in Java S: [...] P: In Java geht das nicht, warum? Wann geht es? S: Wollte hören dass es nur mit ''final'' Variablen geht und die sind unveränderlich. P: Malen sie den Zwischencode zu 4. S: Offset: (x * 50 + 3) * sizeof(int), CSTORE und CALL noch hingemalt. P: Wie funktioniert in Java ''o isinstanceof K''? S: Klassendeskriptoren vergleichen [...]. Wusste ich net so genau, ewig drauf rumgeritten. P: Hier ist ein AST (war sowas wie a*b+c), dynamisch Programmieren: S: Algorithmus mehr oder weniger korrekt angewandt, wollte nach Phase 1 (Kostenberechnung) dann noch Phase 2 (dyn. Programmieren) und Phase 3 (Top-Down durchlauf) erklärt haben. Mir wurde recht viel geholfen, die Benotung war sehr fair. Das Javazeug sollte man schon drauf haben, auch wenn man die Übung in Python geschrieben hat.