ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο Runtime Checking (1/3) Η γλώσσα alpha είναι μια dynamic typing γλώσσα (ο τύπος μιας μεταβλητής αλλάζει ακολουθώντας τον τύπο της τιμής που κάθε φορά αποθηκεύεται σε αυτήν) επομένως δεν μπορούμε κατά την μεταγλώττιση να εφαρμόσουμε έλεγχο τύπων. Ενδιάμεσος κώδικας -Backpatching if (x > 12) a = false; else a = 3.33; b = (a and c);//? x = input(); y =!x; //? 2 Runtime Checking (2/3) Δεν μπορούμε να υλοποιήσουμε πλήρη έλεγχο at compile time, για το λόγο αυτό ο έλεγχος θα γίνει at runtime. Στην περίπτωση των σταθερών εκφράσεων προαιρετικά ο έλεγχος μπορεί να γίνει at compile time. a = true + 12; // Boolean + Number Error b = str1 + false; // String + Boolean Error Runtime Checking (3/3) Run-time Warnings / Run-time Errors l-value = r-value +,-,*,%,++,--,- &&,,! >,>=,<,<= ==,!= (see Lecture 9) 3 4
Alpha i-code (1/3) enum iopcode { assign, add, sub, mul, div, mod, not, if_eq, if_noteq, struct quad { iopcode unsigned unsigned op; res; arg1; arg2; label; line; quad* quads = (quad *) 0; quads[quadno].label = Alpha i-code (2/3) enum expr_t { var_e, tableitem_e, programfunc_e, libraryfunc_e, Σε ένα quad μπορούμε struct expr { δώσουμε τις παρακάτω expr_t type; τιμές: symbol* sym; - σταθερή τιμή index; (string, number, boolean) double numconst; - τιμή συνάρτησης βιβλιοθήκης char* strconst; (όνομα) unsigned char boolconst; - τιμή συνάρτησης προγράμματος next; (διεύθυνση) - κρυφή μεταβλητή - μεταβλητή προγράμματος 5 6 Alpha i-code (3/3) Οπίνακαςγιαταquads είναι δυναμικός, επομένως δεν έχουμε δείκτες σε quads αλλά χρησιμοποιούμε το index του κάθε quad για να αναφερθούμε σε αυτό. if (a > b) c = true; else c = false; index 10 11 12 Op IF_GREATER ASSIGN JUMP ASSIGN Arg1 a false true Arg 2 b Result / Label c c Backpatching Για την αποτίμηση των λογικών εκφράσεων (boolean expressions) υπάρχουν δύο τεχνικές: Ολική αποτίμηση (total boolean evaluation) Αποτιμάται ολόκληρη η έκφραση. Μερική αποτίμηση (short circuit / jumping code) Αποτιμάται μόνο το ελάχιστο αναγκαίο τμήμα της έκφρασης από το οποίο μπορεί να εξαχθεί συμπέρασμα για την τιμή της. 7 8
Ολική αποτίμηση έκφρασης Παράδειγμα a < b or c < d Ο ενδιάμεσος κώδικας που αντιστοιχεί σε αυτή την έκφραση είναι: Μερική αποτίμηση έκφρασης Προσθέτοντας τα συντιθέμενα γνωρίσματα (synthesized attributes) truelist και falselist. Καθώς παράγεται ο ενδιάμεσος κώδικας οι JUMP εντολές δεν συμπληρώνονται. Τα labels που αντιστοιχούν σε αυτές τις εντολές προστίθενται στην κατάλληλη από τις δύο λίστες. 9 10 Γραμματική Ηγραμματικήείναιηεξής: Π.χ. από τον 1 ο κανόνα παρατηρούμε ότι εάν το Ε1 είναι true τότε και το Ε θα είναι true, άρα η λίστα Ε1.truelist γίνεται μέρος της Ε.truelist. Εάν το Ε1 είναι false, τότε πρέπει να εξεταστεί το Ε2. Συναρτήσεις χειρισμού λίστας makelist(i): Δημιουργεί μία νέα λίστα merge(p1, p2): Συνενώνει τις λίστες p1 και p2. backpatch(p, i): Εισάγει το i ως το target label όλων των JUMP εντολών που είναι καταχωρημένα στην p. 11 12
Σημασιολογικοί κανόνες Παράδειγμα (1/5) a < b or c < d and e < f Ο ενδιάμεσος κώδικας που παράγεται είναι: 1 ο Βήμα: Γινεται reduce το a < b από τον κανόνα 2: JUMP _ 2 ο Βήμα: Γίνεται reduce το c < d από τον κανόνα 3: IF_LESS c d _ Παράδειγμα (2/5) Παράδειγμα (3/5) 3 ο Βήμα: Γίνεται reduce το e < f από τον κανόνα 4 ο Βήμα: Από τον κανόνα Ε -> Ε1 and M E2 γίνεται reduce. Εκτελείται ο σημασιολογικός κανόνας backpatch({3}, 5). 2: JUMP _ 3: IF_LESS c d 5 5 ο Βήμα: Από τον κανόνα Ε -> Ε1 or ME2γίνεται reduce. Εκτελείται ο σημασιολογικός κανόνας backpatch({2}, 3). 2: JUMP 3 3: IF_LESS c d 5 15 16
Παράδειγμα (4/5) Παράδειγμα (5/5) Η έκφραση είναι αληθής, εάν εκτελεστούν οι JUMP εντολές με label 1 ή 5. Αντίθετα, η έκφραση είναι ψευδής, εάν εκτελεστούν οι JUMP εντολές με label 4 ή 6. Ποιος όμως θα συμπληρώσει τα target labels αυτών των JUMP εντολών? Στην 11 η διάλεξη (9 η διαφάνεια) παρουσιάστηκε η συνάρτηση patchlabel, η οποία συμπληρώνει το target label μίας JUMP εντολής. Θα πρέπει να τροποποιηθεί αυτή η συνάρτηση, ώστε να συμπληρώνει τα target codes όλων των JUMP εντολών που βρίσκονται στο truelist και στο falselist.. 17 18