150 likes | 291 Views
ΘΠ06 - Μεταγλωττιστές. Ενδιάμεσος Κώδικας – Μεταφραστικά Σχήματα. Βασικές Τετράδες (I). unit I, -, - και endu, I, -, - η αρχή και το τέλος του ενδιάμεσου κώδικα μιας δομικής μονάδας, I είναι το όνομα της δομικής μονάδας op, x, y, z
E N D
ΘΠ06 - Μεταγλωττιστές Ενδιάμεσος Κώδικας – Μεταφραστικά Σχήματα
Βασικές Τετράδες (I) • unit I, -, -καιendu, I, -, - • η αρχή και το τέλος του ενδιάμεσου κώδικα μιας δομικής μονάδας, Iείναι το όνομα της δομικής μονάδας • op, x, y, z • πράξεις ανάμεσα στα xκαι y με αριθμητικότελεστήop (+, -, *, /, %) • πράξεις ανάμεσα στα xκαι y με λογικότελεστήop(<, >, ==, <=, >=) στις οποίες αν η συνθήκη (x op y) είναι αληθής ο έλεγχος μεταφέρεται στην τετράδα με ετικέτα z • =, x, -, z • ανάθεση της τιμής του xστο z
Βασικές Τετράδες (II) • array, x, y, z • αναφορά σε στοιχείο πίνακα (z) , το xείναι ο πίνακας, το yη σχετική απόσταση από τη διεύθυνση του x[0] • if, x, true, z • αν η τιμή του x (boolean) είναι αληθής ο έλεγχος μεταφέρεται στην τετράδα με ετικέταz • jump, -, -, z • άλμα στην τετράδα με ετικέτα z
Βασικές Τετράδες (IIΙ) • call, -, -, I • κλήση υποπρογράμματος με όνομα I • par, x, m, - • πέρασμαορισμάτων υποπρογράμματος, xείναι η παράμετρος και mο τρόπος περάσματος • ret, -, -, - • επιστροφή απο την εκτέλεση μιας δομικής μονάδος
Στοιχεία Πίνακα (Ι) • Τα στοιχεία ενός πίνακα αποθηκεύονται συνεχόμενα σε ένα μπλοκ διευθύνσεων • Για να προσπελάσουμε το στοιχείο i ενός πίνακα Α τύπου w • βάση + i ×w -- για πίνακα μιας διάστασης • βάση + i1 × w1 + i2 × w2 + … + in × wn-- για πίνακα n διαστάσεων Α[0,0] 1η γραμμή Ενας πίνακας Α διαστάσεων 2 × 3 αποθηκέυεται σε row-major format Α[0,1] Α[0,2] Α[1,0] 2η γραμμή Α[1,1] Α[1,2]
Στοιχεία Πίνακα (ΙΙ) • Παράδειγμα • int a[x], b[y]; • …. • x = a[i] + b[j]; • 1: mul, i, 4, t1 • 2: array, a, t1, t2 • 3: mul, j, 4, t3 • 4: array, b, t3, t4 • 5: add, t2, t4, t5 • 6: assign, t5, -, x • int a[2][3]; • …. • x = c + a[i][j] ; • 1: mul, i, 12, t1 • 2: mul, j, 4, t2 • 3: add, t1, t2, t3 • 4: array, a, t3, t4 • 5: add, c, t4, t5 • 5: assign, t5, -, x W1 = 4 (int) w2 = 3 × 4 (δεύτερη διάσταση × w1)
Εντολή if (I) • if (expr) stmt • if (a+b > c-d) • x = a+b; • 1: add, a, b, t1 • 2: sub, c, d, t2 • 3: great, t1, t2, 6 • 4: assign, false, -, t3 • 5: jump, -, -, 7 • 6: assign, true, -, t3 • 7, if, t3, true, 9 • 8: jump, -, -, 11 • 9: add, a, b, t4 • 10: assign, t4, -, x • 11: … Ενδιάμεσος κώδικας για το expr if, texpr, true, l1 expr quads (1 – 6) jump, -, -, l2 l1: … Ενδιάμεσος κώδικας για το stmt if quads (7 – 8) stmt quads (9 – 10) l2: …
Εντολή if (II) if_stmt: TK_IF ‘(‘ cond ‘)’ { c1 } stmt { c2 } c1: $3.truelist = emit(“if”, $3.place, “true”, L1); $3.falselist = emit(“jump”, “-”, “-”, L2) backpatch($3.truelist, nextquad()); c2: backpatch($3.falselist, nextquad());
Εντολή if – else (I) • if (expr) stmt1 else stmt2 • if (x > y) • a = x; • else • a = y; • 1: great, x, y, 4 • 2: assign, false, -, t1 • 3: jump, -, -, 5 • 4: assign, true, -, t1 • 5, if, t1, true, 7 • 6: jump, -, -, 9 • 7:assign, a, -, x • 8: jump, -, -, 10 • 9: assign, a, -, y • 10:… Ενδιάμεσος κώδικας για το expr if, texpr, true, l1 jump, -, -, l2 l1: … Ενδιάμεσος κώδικας για το stmt1 expr quads (1 – 4) if quads (5 – 6) jump, -, -, l3 l2: … stmt1 quad Ενδιάμεσος κώδικας για το stmt2 stmt2 quad l3: …
Εντολή if – else (II) if_stmt: TK_IF ‘(‘ cond ‘)’ { c1 } stmt TK_ELSE {c2} stmt {c3} c1: $3.truelist = emit(“if”, $3.place, “true”, L1); $3.falselist = emit(“jump”, “-”, “-”, L2) backpatch($3.truelist, nextquad()); c2: $5.nextlist = emit(“jump”, “-”, “-”, L3 ) backpatch($3.falselist, nextquad()); c3: backpatch($5.nextlist, nextquad());
Εντολή while (I) • while (expr) stmt • while (a > b) • a = a + 1; • 1: great, a, b, 4 • 2: assign, false, -, t1 • 3: jump, -, -, 5 • 4: assign, true, -, t1 • 5, if, t1, true, 7 • 6: jump, -, -, 10 • 7: add, a, 1, t2 • 8: assign, a, t2 • 9: jump, -, -, 1 • 10: … l1: … Ενδιάμεσος κώδικας για το expr if, texpr, true, l2 expr quads (1 – 4) jump, -, -, l3 l2: … while quads (5 – 6, 9) Ενδιάμεσος κώδικας για το stmt stmt quads (5 – 6) jump, -, -, l1 l3: …
Εντολή while (II) while_stmt: TK_WHILE { c1 } ‘(‘ cond‘)’ { c2 } stmt { c3 } c1: l = nextquad(); c2: $3.truelist = emit(“if”, $3.place, “true”, L1); $3.falselist = emit(“jump”, “-”, “-”, L2) backpatch($3.truelist, nextquad()); c3: emit(“jump”, “-”, “-”, l) backpatch($3.falselist, nextquad())
Συναρτήσεις (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
Συναρτήσεις (II) • f(a) • 1: param, a, V, - • 2: call, f, 1, - • n = f(a) • 1: param, a, V, - • 2: param, t1, RET, - • 3: call,f, 1, RET • 4: assign, t1, -, n • n = f(a) • 1: param, a, V, - • 2: call,f, 1, t1 • 3: assign, t1, -, n
Αλλαγές στο bison • Στο union προσθέτουμε • την μεταβλητή PLACE η οποία περιέχει την θέση όπου βρίσκεται η τιμή μιας μεταβλητής ή την τιμή της αν είναι σταθερά • την μεταβλητή NEXT (ή NEXTLIST) η οποία περιέχει μια λίστα από ετικέτες τετράδων που έχουν παραχθεί από την μετάφραση του συμβόλου (μόνο για σύμβολα stmt, expr, block κτλ) • τις μεταβλητές TRUEκαι FALSE (ή TRUELIST, FALSELIST) που περιέχουν λίστες από ετικέτες τετράδων που παράγονται κατά την μετάφραση λογικών συνθηκών και δηλώνουν που θα μεταφερθεί ο έλεγχος αν η συνθήκη είναι αληθής ή ψευδής αντίστοιχα