Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεGrigorov Tripi Τροποποιήθηκε πριν 9 χρόνια
1
ΘΠ06 - Μεταγλωττιστές Ενδιάμεσος Κώδικας – Μεταφραστικά Σχήματα
2
Βασικές Τετράδες (I) unit I, -, -και endu, I, -, - η αρχή και το τέλος του ενδιάμεσου κώδικα μιας δομικής μονάδας, I είναι το όνομα της δομικής μονάδας op, x, y, z πράξεις ανάμεσα στα x και y με αριθμητικό τελεστή op (+, -, *, /, %) πράξεις ανάμεσα στα x και y με λογικό τελεστή op (, ==, =) στις οποίες αν η συνθήκη (x op y) είναι αληθής ο έλεγχος μεταφέρεται στην τετράδα με ετικέτα z =, x, -, z ανάθεση της τιμής του x στο z
3
Βασικές Τετράδες (II) array, x, y, z αναφορά σε στοιχείο πίνακα (z), το x είναι ο πίνακας, το y η σχετική απόσταση από τη διεύθυνση του x[0] if, x, true, z αν η τιμή του x (boolean) είναι αληθής ο έλεγχος μεταφέρεται στην τετράδα με ετικέτα z jump, -, -, z άλμα στην τετράδα με ετικέτα z
4
Βασικές Τετράδες (IIΙ) call, -, -, I κλήση υποπρογράμματος με όνομα I par, x, m, - πέρασμα ορισμάτων υποπρογράμματος, x είναι η παράμετρος και m ο τρόπος περάσματος ret, -, -, - επιστροφή απο την εκτέλεση μιας δομικής μονάδος
5
Στοιχεία Πίνακα (Ι) Τα στοιχεία ενός πίνακα αποθηκεύονται συνεχόμενα σε ένα μπλοκ διευθύνσεων Για να προσπελάσουμε το στοιχείο i ενός πίνακα Α τύπου w βάση + i ×w -- για πίνακα μιας διάστασης βάση + i 1 × w 1 + i 2 × w 2 + … + i n × w n -- για πίνακα n διαστάσεων Α[0,0] Α[0,1] Α[0,2] Α[1,0] Α[1,1] Α[1,2] Ενας πίνακας Α διαστάσεων 2 × 3 αποθηκέυεται σε row-major format 1 η γραμμή 2 η γραμμή
6
Στοιχεία Πίνακα (ΙΙ) Παράδειγμα int a[x], b[y]; …. x = a[i] + b[j]; 1: mul, i, 4, t 1 2: array, a, t 1, t 2 3: mul, j, 4, t 3 4: array, b, t 3, t 4 5: add, t 2, t 4, t 5 6: assign, t 5, -, x int a[2][3]; …. x = c + a[i][j] ; 1: mul, i, 12, t 1 2: mul, j, 4, t 2 3: add, t 1, t 2, t 3 4: array, a, t 3, t 4 5: add, c, t 4, t 5 5: assign, t 5, -, x W 1 = 4 (int) w 2 = 3 × 4 (δεύτερη διάσταση × w 1 )
7
Εντολή if (I) if (expr) stmt Ενδιάμεσος κώδικας για το expr if, t expr, true, l 1 Ενδιάμεσος κώδικας για το stmt l 1 : … jump, -, -, l 2 l 2 : … if (a+b > c-d) x = a+b; 1: add, a, b, t 1 2: sub, c, d, t 2 3: great, t 1, t 2, 6 4: assign, false, -, t 3 5: jump, -, -, 7 6: assign, true, -, t 3 7, if, t 3, true, 9 8: jump, -, -, 11 9: add, a, b, t4 10: assign, t4, -, x 11: … expr quads (1 – 6) if quads (7 – 8) stmt quads (9 – 10)
8
Εντολή if (II) if_stmt:TK_IF ‘(‘ cond ‘)’ { c 1 } stmt { c 2 } c 1 : $3.truelist = emit(“if”, $3.place, “true”, L 1 ); $3.falselist = emit(“jump”, “-”, “-”, L 2 ) backpatch($3.truelist, nextquad()); c 2 : backpatch($3.falselist, nextquad());
9
Εντολή if – else (I) if (expr) stmt 1 else stmt 2 Ενδιάμεσος κώδικας για το expr if, t expr, true, l 1 Ενδιάμεσος κώδικας για το stmt 1 l 1 : … jump, -, -, l 2 l 2 : … jump, -, -, l 3 Ενδιάμεσος κώδικας για το stmt 2 l 3 : … if (x > y) a = x; else a = y; 1: great, x, y, 4 2: assign, false, -, t 1 3: jump, -, -, 5 4: assign, true, -, t 1 5, if, t 1, true, 7 6: jump, -, -, 9 7: assign, a, -, x 8: jump, -, -, 10 9: assign, a, -, y 10: … expr quads (1 – 4) if quads (5 – 6) stmt 1 quad stmt 2 quad
10
Εντολή if – else (II) if_stmt:TK_IF ‘(‘ cond ‘)’ { c 1 } stmt TK_ELSE {c 2 } stmt {c 3 } c 1 : $3.truelist = emit(“if”, $3.place, “true”, L 1 ); $3.falselist = emit(“jump”, “-”, “-”, L 2 ) backpatch($3.truelist, nextquad()); c 2 : $5.nextlist = emit(“jump”, “-”, “-”, L 3 ) backpatch($3.falselist, nextquad()); c 3 : backpatch($5.nextlist, nextquad());
11
Εντολή while (I) while (expr) stmt Ενδιάμεσος κώδικας για το expr if, t expr, true, l 2 Ενδιάμεσος κώδικας για το stmt l 2 : … jump, -, -, l 3 l 3 : … l 1 : … jump, -, -, l 1 while (a > b) a = a + 1; 1: great, a, b, 4 2: assign, false, -, t 1 3: jump, -, -, 5 4: assign, true, -, t 1 5, if, t 1, true, 7 6: jump, -, -, 10 7: add, a, 1, t 2 8: assign, a, t 2 9: jump, -, -, 1 10: … expr quads (1 – 4) while quads (5 – 6, 9) stmt quads (5 – 6)
12
Εντολή while (II) while_stmt: TK_WHILE { c 1 } ‘(‘ cond ‘)’ { c 2 } stmt { c3 } c 1 : l = nextquad(); c 2 : $3.truelist = emit(“if”, $3.place, “true”, L 1 ); $3.falselist = emit(“jump”, “-”, “-”, L 2 ) backpatch($3.truelist, nextquad()); c 3 : emit(“jump”, “-”, “-”, l) backpatch($3.falselist, nextquad())
13
Εντολές break και continue Ενδιάμεσος κώδικας για το expr if, t expr, true, l 2 Ενδιάμεσος κώδικας για το stmt l 2 : … jump, -, -, l 3 l 3 : … l 1 : … jump, -, -, l 1 breakcontinue 1: great, a, b, t 1 2: assign, false, -, t 1 3: jump, -, -, 5 4: assign, true, -, t 1 5, if, true, t1, 7 6: jump, -, -, 15 7: add, a, 1, t 2 8: assign, a, t 2 9: eq, a, 3, t 3 10: assign, false, t 3 11: jump, -, -, 13 12: assign, true, t 3 13: jump, -, -, 15 13: jump, -, -, 1 14: jump, -, -, 1 15: … while (a > b) { a = a + 1; if( a == 3 ) break ; } break quad continue quad
14
Συναρτήσεις (I) Δήλωση συναρτήσεων η λίστα τετράδων που προκύπτουν από το το σώμα της συνάρτησης περικλείονται από τις τετράδες unit, func_name, -, - endu, func_name, -, - Κλήση συναρτήσεων πέρασμα παραμέτρων param, p_name, c_type, - ανάθεση αποτελέσματος επιστροφής συνάρτησης param, p_name, RET, - κλήση συνάρτησης call, func_name, num_param, - call, func_name, num_param, RET call, func_name, num_param, return_param
15
Συναρτήσεις (II) f(a) 1: param, a, V, - 2: call, f, 1, - n = f(a) 1: param, a, V, - 2: param, t 1, RET, - 3: call, f, 1, RET 4: assign, t 1, -, n n = f(a) 1: param, a, V, - 2: call, f, 1, t 1 3: assign, t 1, -, n
16
Αλλαγές στο bison Στο union προσθέτουμε την μεταβλητή PLACE η οποία περιέχει την θέση όπου βρίσκεται η τιμή μιας μεταβλητής ή την τιμή της αν είναι σταθερά την μεταβλητή NEXT (ή NEXTLIST) η οποία περιέχει μια λίστα από ετικέτες τετράδων που έχουν παραχθεί από την μετάφραση του συμβόλου (μόνο για σύμβολα stmt, expr, block κτλ) τις μεταβλητές TRUE και FALSE (ή TRUELIST, FALSELIST) που περιέχουν λίστες από ετικέτες τετράδων που παράγονται κατά την μετάφραση λογικών συνθηκών και δηλώνουν που θα μεταφερθεί ο έλεγχος αν η συνθήκη είναι αληθής ή ψευδής αντίστοιχα
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.