32
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-1 Παραγωγή Ενδιάμεσου Κώδικα Ο ενδιάμεσος κώδικας αποτελεί τη γλώσσα επικοινωνίας ανάμεσα στο εμπρόσθιο και οπίσθιο τμήμα ενός μεταγλωττιστή. Ο χωρισμός σε εμπρόσθιο και ενδιάμεσο τμήμα επιτρέπει: Τη δημιουργία μεταγλωττιστών για νέες αρχιτεκτονικές με αλλαγή μόνο του οπίσθιου τμήματος. Τη βελτιστοποίηση στο επίπεδο της αφηρημένης μηχανής του ενδιάμεσου κώδικα. Τυπικά ο ενδιάμεσος κώδικας παράγεται από μία μετάφραση κατευθυνόμενη από τη σύνταξη. L e xica lA n a lyze r C ode G enerator C ode O ptim izer Inte rm e d ia te co d e G enerator S em an tic A nalyzer S yn ta x A nalyzer S o u rce Target Front Back

Π αραγωγή Ενδιάμεσου Κώδικα

Embed Size (px)

DESCRIPTION

Π αραγωγή Ενδιάμεσου Κώδικα. Ο ενδιάμεσος κώδικας αποτελεί τη γλώσσα επικοινωνίας ανάμεσα στο εμπρόσθιο και οπίσθιο τμήμα ενός μεταγλωττιστή. Ο χωρισμός σε εμπρόσθιο και ενδιάμεσο τμήμα επιτρέπει: Τη δημιουργία μεταγλωττιστών για νέες αρχιτεκτονικές με αλλαγή μόνο του οπίσθιου τμήματος. - PowerPoint PPT Presentation

Citation preview

Page 1: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-1

Παραγωγή Ενδιάμεσου Κώδικα• Ο ενδιάμεσος κώδικας αποτελεί τη γλώσσα

επικοινωνίας ανάμεσα στο εμπρόσθιο και οπίσθιο τμήμα ενός μεταγλωττιστή.

• Ο χωρισμός σε εμπρόσθιο και ενδιάμεσο τμήμα επιτρέπει:– Τη δημιουργία μεταγλωττιστών για νέες

αρχιτεκτονικές με αλλαγή μόνο του οπίσθιου τμήματος.

– Τη βελτιστοποίηση στο επίπεδο της αφηρημένης μηχανής του ενδιάμεσου κώδικα.

• Τυπικά ο ενδιάμεσος κώδικας παράγεται από μία μετάφραση κατευθυνόμενη από τη σύνταξη.

Lexical Analyzer

Code G enerator

Code O ptim izer

Interm ediate codeGenerator

Sem antic Analyzer

Syntax Analyzer

Source

Target

Fron

tB

ack

Page 2: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-2

Ενδιάμεσες Γλώσσες• Η γλώσσα στην οποία εκφράζεται ο ενδιάμεσος κώδικας

πρέπει:– Να είναι ικανή να εκφράσει τις λειτουργίες των

γλωσσών υψηλού επιπέδου.– Να είναι δυνατό να μεταφραστεί εύκολα και αποδοτικά

(δηλ. να μπορεί να εκμεταλλευτεί πρόσθετες δυνατότητες) στην εκάστοτε γλώσσα μηχανής.

C

Prolog

Fortran

PascalInterm ediate

code

x86

PPC

Sparc

MIPS

• Συνήθως χρησιμοποιούνται οι εξής ενδιάμεσες γλώσσες:

– Αφηρημένα συντακτικά δένδρα ή γράφοι– Επιθεματικός κώδικας– Κώδικας τριών διευθύνσεων

Page 3: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-3

Γραφικές Ενδιάμεσες Γλώσσες• Αφηρημένα συντακτικά δένδρα (AST): συντακτικά

δένδρα στα οποία δεν υπάρχουν μη-τερματικά σύμβολα. • Ακυκλικοί κατευθυνόμενοι γράφοι (DAG): προκύπτουν

με τροποποίηση των συναρτήσεων mknode & mkleaf, της της μετάφρασης που παράγει το AST (απαλειφή κοινών υποεκφράσεων).

• Παράδειγμα: a = b * - c + b * - cassign

um inus um inus

a

c

b

c

b

**

+

assign

um inus

a

c

b

*

+

AST D AG

Page 4: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-4

Δημιουργία ΑST & DAG• H δημιουργία γίνεται με την βοήθεια μετάφρασης

οδηγούμενη από τη σύνταξη. Π.χ.

• H υλοποίηση του δένδρου μπορεί ναγίνει με τη μορφή πίνακα:

Production Semantic RuleS = id, ":=", E S.nprt = mknode("assign", mkleaf(id,id.place), E.nptr)E = E1, "+", E2 E.nprt = mknode("+", E1.nptr, E2.nptr)E = E1, "*", E2 E.nprt = mknode("*", E1.nptr, E2.nptr)E = "-", E1 E.nprt = mkunode("uminus", E1.nptr)E = "(", E1 , ")" E.nprt = E1.nptrE = id E.nprt = mkleaf(id,id.place)

0 id b1 id c2 uminus 13 * 0 24 + 3 35 assign a 4

Page 5: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-5

Επιθεματικός Κώδικας• Ο επιθεματικός κώδικας (postfix notation) είναι μία γραμμική

αναπαράσταση του αφηρημένου συντακτικού δένδρου. • Σχηματίζεται τοποθετώντας τους κόμβους του δένδρου σε μία

λίστα, ώστε ένας κόμβος να εμφανίζεται αμέσως μετά τα παιδιά του. Π.χ. για το προηγούμενο παράδειγμα :a b c uminus * b c uminus * + assign

• H λειτουργία του βασίζεται στην ύπαρξη μίας στοίβας στο οποίο τοποθετούνται όλοι οι κόμβοι. Η τοποθέτηση ενός τελεστή πυροδοτεί την εκτέλεσή του, την αφαίρεση των ορισμάτων του από τη στοίβα και την τοποθέτηση του αποτελέσματος.

• Η στοίβα περιορίζει τις δυνατές βελτιστοποιήσεις καθώς ελαττώνει τις δυνατές τροποποιήσεις στη θέση των κόμβων.

Page 6: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-6

Κώδικας Τριών Διευθύνσεων• Ο κώδικας τριών διευθύνσεων (ΚΤΔ) αποτελείται από

εντολές της μορφής:x := y op zόπου x, y, z είναι ονόματα μεταβλητών, σταθερές ή βοηθητικές μεταβλητές που δημιουργεί ο μεταγλωττιστής.

• O χαρακτηρισμός «κώδικας τριών διευθύνσεων» προέρχεται από το γεγονός ότι κάθε εντολή περιέχει τρείς διευθύνσεις.

• Ο ΚΤΔ δεν επιτρέπει την άμεση αναπαράσταση περίπλοκων εκφράσεων. Π.χ. για την έκφραση x+y*z έχουμε:t1 := y * zt2 := x + t1

Page 7: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-7

Τύποι εντολών ΚΤΔ• Εντολές εκχώρησης (assignment)

x := y op zx := op y (μοναδιαίος τελεστής)x := y (αντιγραφή)

• Eντολές διακλάδωσης με και χωρίς συνθήκηgoto L (όπου L ετικέτα)if x relop y goto L (όπου relop σχεσιακός τελεστής: <, =, κλπ)

• ΕτικέτεςL:

ή label L

Page 8: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-8

Τύποι εντολών ΚΤΔ (2)• Κλήσης διαδικασιών

param x τοποθέτηση της παραμέτρου x στη στοίβαcall p, n κλήση της διαδικασίας p με n παραμέτρουςreturn y επιστροφή της τιμής yΠ.χ. για την κλήση της διαδικασίας p(x1, x2, …, xn):param x1param x2…call p, n

• Εντολές προσπέλασης πινάκωνx := y[i] θέσε το x ίσο με τα περιεχόμενα της θέσης μνήμης που βρίσκεται απόσταση i από τη θέση yx[i] := y

Page 9: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-9

Τύποι εντολών ΚΤΔ (3)• Εντολές δεικτών και διευθυνσιοδότησης (pointers &

addressing)x := &y δώσε στο x την διεύθυνση του yx := *y δώσε στο x τα περιεχόμενα της διεύθυνση που περιέχεται στο y*x := y

• Π.χ. if (x == 0) then y=1 else y=3if x = 0 goto L1y := 3goto L2

L1:y := 1

L2:

Page 10: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-10

Παραγωγή ΚΤΔ• H παραγωγή ΚΤΔ επιτυγχάνεται με τη χρήση μετάφρασης

κατευθυνόμενης από τη σύνταξη.• Κατά την παραγωγή χρησιμοποιούμε για κάθε σύμβολο της

γραμματικής μία σειρά από χαρακτηριστικά (attributes) που μας επιτρέπουν να αναφερόμαστε σε σχετικές διευθύνσεις καθώς και στον κώδικα που τα υπολογίζει.

• Χαρακτηριστικά για εκφράσεις E (expressions):– E.place : η διεύθυνση που κρατά την τιμή της Ε– E.code : ο κώδικας που υπολογίζει την Ε

• Χαρακτηριστικά για πρότάσεις S (statements):– S.begin: η διεύθυνση της πρώτης εντολής του κώδικα της S– S.after : η διεύθυνση της πρώτης εντολής μετά την S

Page 11: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-11

Βοηθητικές Συναρτήσεις• Κατά την παραγωγή του ΚΤΔ απαιτείται η δέσμευση

προσωρινής μνήμης ή η παραγωγή ετικετών για αναφορά από τις εντολές διακλάδωσης. Οι ακόλουθες συναρτήσεις επιτελούν αυτές και άλλες λειτουργίες:– newtemp() : επιστρέφει το όνομα (ή το δείκτη στον

πίνακα συμβόλων) μίας καινούργιας προσωρινής μεταβλητής κάθε φορά που καλείται. Ενδεχομένως να δέχεται ως παράμετρο τον τύπο της μεταβλητής.

– newlabel() : επιστρέφει μία νέα ετικέτα– gen() : παράγει το ΚΤΔ που της δίνεται ως παράμετρο.

Η παραγωγή μπορεί να συνίσταται στη χρήση ειδικής αναπαράστασης (π.χ. πίνακας εγγραφών) ή στην αποθήκευση του ενδιάμεσου κώδικα σε αρχείο. Π.χ.gen(x “:=” y “+” z)

Page 12: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-12

Παράδειγμα : ΚΤΔ για εκφράσειςProduction Semantic Rule

S = id, ":=", E S.code := E.code || gen(id.place ":=" E.place)E = E1, "+", E2 E.place := newtemp

E.code := E1.code || E2.code || gen( E.place ":=" E1.place "+" E2.place)

E = E1, "*", E2 E.place := newtempE.code := E1.code || E2.code || gen( E.place ":=" E1.place "*" E2.place)

E = "-", E1 E.place := newtempE.code := E1.code || gen( E.place ":=" "uminus" E1.place)

E = "(", E1 , ")" E.place := E1.placeE.code := E1.code

E = id E.place := id.placeE.code := ""

Page 13: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-13

Παράδειγμα : μετάφραση WHILEProduction Semantic Rule

S = while, E, do, S1 S.begin = newlabel()S.after = newlabel()S.code := gen(S.begin ":") || E.code || gen("if" E.place "=" "0" "goto" S.after) || S1.code || gen("goto" S.begin) || gen(S.after ":")

E.code

if E .place = 0 goto S .after

S 1.code

goto S .begin

S.begin:

S .after:

Page 14: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-14

Αναπαράσταση του ΚΤΔ• Κάθε εντολή του ΚΤΔ μπορεί να αναπαρασταθεί με τη

μορφή μίας εγγραφής με κατάλληλα πεδία. Η επικρατέστερη αναπαράσταση είναι με τη χρήση τετράδων (quadruples). Π.χ.x := y + z if t1 > t2 goto L

• Στην πράξη, η διαφοροποίηση ανάμεσα σε παραμέτρους που είναι π.χ. σταθερές ή διευθύνσεις, μπορεί να γίνει είτε με χρήση ψηφίων (bits) στο πεδίο του τελεστή ή με πρόσθετα πεδία.

op

src1

src2

dest

plus

y

z

x

JMP_GEop

src1

src2

dest

t1

t2

L

Page 15: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-15

Δηλώσεις Μεταβλητών• Συνήθως, κατά την παραγωγή του ενδιάμεσου αλλά και του

τελικού κώδικα, δεν είναι γνωστές οι απόλυτες θέσεις στη μνήμη των μεταβλητών.Έτσι, συνηθίζεται να τις τοποθετούμε σε μία κοινή περιοχή (π.χ. data segment, ή stack segment για τοπικές μεταβλητές) και να χρησιμοποιούμε ως διεύθυνσή τους την απόστασή τους (offset) από την αρχή της περιοχής.

Production Semantic RuleP = D offset = 0D = D, DD = id, “:” , T enter(id.name, T.type, offset)

offset += T.widthT = integer T.type = integer

T.width = 4T = real T.type = real

T.width = 8T = array,“[”,num, “]”, of, T1 T.type = array(num.val,T1.type)

T.width = num.val * T1.width

Page 16: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-16

Aντίστοιχο Σχέδιο ΜετάφρασηςP = {offset = 0}, D

D = D, D

D = id, “:” , T, {enter(id.name, T.type, offset); offset += T.width}

T = integer, {T.type = integer; T.width = 4}

T = real , {T.type = real; T.width = 8}

T = array,“[”,num, “]”, of, T1, {T.type=array(num.val,T1.type);

T.width = num.val * T1.width}

Page 17: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-17

Τοπικές μεταβλητές• Μία από τις πιο συνηθισμένες προσεγγίσεις για τη

διαχείριση των τοπικά ορισμένων αναγνωριστικών, είναι η δημιουργία ενός ξεχωριστού πίνακα συμβόλων.

• Για την πιο δύσκολη περίπτωση των φωλιασμένων διαδικασιών, η χρήση των ξεχωριστών πινάκων συμβόλων μπορεί να συνδυαστεί με δύο στοίβες: – tblptr : η οποία περιέχει δείκτες στους πίνακες

συμβόλων των φωλιασμένων διαδικασιών.– offset : η οποία περιέχει τις αποστάσεις του διαθέσιμου

χώρου κάθε διαδικασίας από την αρχή του χώρου των μεταβλητών.

• Όποτε μπαίνουμε στο σώμα μίας διαδικασίας, δημιουργούμε ένα καινούργιο πίνακα συμβόλων και βάζουμε τη διεύθυνσή του στη στοίβα tblptr. Αντίστοιχα, τοποθετούμε την τιμή 0 (νέο offset=0) στη στοίβα offset.

Page 18: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-18

Παράδειγμαprogram sort(input, output);

var a : array[0..10] of integer; x : integer;

procedure readarray;var i: integer; begin … end;

procedure exchange(i, j : integer);begin … end;

procedure quicksort(m, n: integer);var k, v : integer;function partition(y,z : integer) : integer;

var i, j : integer;begin … end ;

begin… end;begin … end.

Page 19: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-19

Παράδειγμα Σχεδίου Μετάφρασης P = M, D, { addwidth(top(tblptr), top(offset));

pop(tblptr); pop(offset);}M = ε , {t = mktable(nil); push(t, tblptr); push(0, offset);}D = D1, “;”, D2,

D = proc, id, “;”, N, D1, “;”, S, {t=top(tblptr); addwidth(t, top(offset)); pop(tblptr); pop(offset);enterproc(top(tblptr), id.name, t);}

D = id, “:”, T, { enter(top(tblptr), id.name, T.type, top(offset)); top(offset)+= T.size; }

N = ε , {t = mktable(top(tblptr)); push(t, tblptr); push(0, offset);}

Page 20: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-20

Απεικόνιση της οργάνωσης των Π.Σ.readarray

exchange

ax

readarrayexchangequ icksort

n il header

iheader

iheader

j

mheader

nkv

partition

yheader

zij

qu icksort

sort

partition

Page 21: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-21

Επεξήγηση Συναρτήσεων• mktable(previous) : δημιουργεί ένα καινούργιο πίνακα

συμβόλων και επιστρέφει ένα δείκτη σε αυτόν. Ο δείκτης previous αφορά το πίνακα συμβόλων της διαδικασίας που περιέχει αυτή που εξετάζουμε και καταχωρείται στα δεδομένα του νέου πίνακα, ώστε να είναι δυνατή η αναζήτηση μη-τοπικών μεταβλητών.

• enter(table, name, type, offset): εισάγει τη μεταβλητή με όνομα name, τύπο type και διεύθυνση offset στον πίνακα συμβόλων table.

• addwidth(table, width): καταχωρεί στον πίνακα table το μέγεθος των τοπικών δεδομένων.

• enterproc(table, name, newtable): εισάγει τη διαδικασία με όνομα name και πίνακα συμβόλων newtable, στο πίνακα συμβόλων της διαδικασίας που την περιέχει.

Page 22: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-22

Εγγραφές (records)• Η καταχώρηση των πεδίων των εγγραφών γίνεται επίσης

με δημιουργία ενός νέου πίνακα συμβόλων. • Π.χ.

R = struct, L, D, “;” , { T.type = record(top(tblptr));T.size = top(offset);pop(tblptr); pop(offset);}

L = ε, {t = mktable(nil);push(t, tblptr);push(0,offset); }

Page 23: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-23

Μεταβλητές - Πίνακες• H διεύθυνση του i-στού στοιχείου ενός πίνακα ορισμένου ως

εξής: T[low...high], προυποθέτοντας ότι την αποθήκευση των στοιχείων του πίνακα σε διαδοχικές θέσεις μνήμης, δίνεται από την σχέση:base + (i - low)*wόπου base : είναι η διεύθυνση της βάσης του πίνακαw : το μέγεθος των στοιχείων του πίνακα.Η σχέση αυτή μπορεί να γραφτεί και ως εξής:i*w + (base - low*w)όπου ο δεύτερος όρος του αθροίσματος είναι σταθερός, μπορεί να υπολογιστεί κατά την μεταγλώττιση και να αποθηκευτεί ως χαρακτηριστικό του πίνακα.

Page 24: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-24

Μεταβλητές - Πίνακες (2)• Για διδιάστατο πίνακα Τ[low1…high1, low2…high2] με

οργάνωση κατά γραμμές (row-major) η διεύθυνση του στοιχείου Τ[i1, i2] είναι:base + ((i1-low1)*(high2-low2) + i2-low2)*w = = (i1*(high2-low2) + i2)*w ++ base - (low1*(high2-low2) -low2)*w

• Παραγωγή ΚΤΔ:Var = id, “[”, {IDX.array = lookup(id.name);}, IDX, “]”IDX = E, {t = newtemp; gen(t “=” E.place “*” w(IDX.array));gen(t “=” t “+” c(IDX.array)) ;IDX.place = t;}

σταθερά c

Page 25: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-25

Λογικές εκφράσεις• Mία πρώτη προσέγγιση στην παραγωγή ΚΤΔ για τον

υπολογισμό λογικών εκφράσεων είναι η ακόλουθη:ΒΕxpr = E1, relop, E2, { E1.code || E2.code ||t = newtemp;L = newlabel;gen(t “=” 1);gen(if E1.place relop E2.place goto L);gen(t “=” 0);gen(L “:”); }

• To πρόβλημα με την παραπάνω προσέγγιση είναι ότι σε πολλές περιπτώσεις δεν είναι αναγκαίος ο υπολογισμός και των δύο υποεκφράσεων. Εξαίρεση αποτελεί η περίπτωση που αυτές προκαλούν άλλα επακόλουθα (side-effects), π.χ. Ι AND (j++) .

Page 26: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-26

Bραχυκυκλωμένες Λογικές Εκφράσεις• Εναλλακτικά, μπορούμε να “βραχυκυκλώσουμε” (short-circuit)

τον υπολογισμό των υποεκφράσεων κάνοντας χρήση δύο χαρακτηριστικών: ΒΕxpr.true και ΒΕxpr.false,και δημιουργώντας για κάθε λογική έκφραση ΚΤΔ της μορφής:if Bexpr.place = 1 goto BExpr.truegoto Bexpr.falseδηλ. κωδικοποιώντας την τιμή της έκφρασης ανάλογα με το σημείο του κώδικα που μεταβαίνουμε.

• Στην περίπτωση που έχουμε μία έκφραση της μορφής E = E1 AND E2

μπορούμε να θέσουμε E1.false = E.false ώστε να μην απαιτείται o υπολογισμός του Ε2.

Page 27: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-27

Bραχυκυκλωμένες Λογικές Εκφράσεις (2)E = E1, AND, E2, { Ε1.true = newlabel;

E1.false = E.false;

E2.true = E.true;

E2.false = E.false;

E.code = E1.code || gen(E1.true “:”) || E2.code}

E = E1, OR, E2, { Ε1.false = newlabel;

E1.true = E.false;

E2.true = E.true;

E2.false = E.false;

E.code = E1.code || gen(E1.false “:”) || E2.code}

E = not, E1, { Ε1.false = E.true; E1.true = E.false;

E.code = E1.code}

Page 28: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-28

Εντολές ΕλέγχουProduction Semantic Rule

S = if, E, then, S1 E.true = newlabel;E.false = S.afterS.code := E.code || gen(E.true ":") || S1.code

S = if, E, then, S1 , else, S2 E.true = newlabel;E.false = newlabel;S.code := E.code || gen(E.true ":") || S1.code || || gen(goto S.after) || gen(E.false ":") || S2.code

E.code

S 1.code

E.true

E.fa lseE.true:

E.false:

E .code

S 1.code

E.true

E.falseE.true:

E .false:S 2.code

goto S .after

S.after:

Page 29: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-29

Προτάσεις switch-case• Το κλειδί στην υλοποίηση μίας πρότασης switch είναι η

επιλογή του τρόπου διακλάδωσης:– Αν ο αριθμός των περιπτώσεων (cases) είναι μικρός π.χ.

~10, η παραγωγή ΚΤΔ μπορεί να βασιστεί σε διαδοχικές εντολές if … goto

– Aν ο αριθμός των καταστάσεων είναι μεγάλος μπορούμε να κατασκευάσουμε ένα πίνακα κατακερματισμού (hash) με κλειδιά τις τιμές των προτάσεων case και τιμές τις ετικέτες των goto.

– Αν οι εντολές case χρησιμοπoιούν ένα μικρό διάστημα τιμών, μπορούμε να κατασκευάσουμε ένα πίνακα με τις διευθύνσεις των μεταβάσεων (jump table).

• Σε περίπτωση αποτυχίας εύρεσης της κατάλληλης τιμής με τους παραπάνω τρόπους, κάνουμε goto default.

Page 30: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-30

Παράδειγμα ΚΤΔ για εντολές switchswitch E {begin

case V1 : S1

case V2 : S2

…case Vn-1:Sn-1

default : Sn

end

E.codegoto testL1: S1.code

goto nextL2: S2.code

goto next…

Ln: Sn.codegoto next

test: if E.place = V1 goto L1 if E.place = V2 goto L2…goto Ln

next:

KTΔ

Page 31: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-31

Παραγωγή ΚΤΔ για switch-caseSS = switch, E, begin, {LC.next = newlabel;

LC.ctrl_var = E.place},LC, end, {SS.code = E.code || LC.code |||| gen(LC.next “:”) }

LC = {LC1.next = LC.next; LC1.ctrl_var = LC.ctrl_var}LC1, case, E, “:”, S, { L = newlabel;LC.code = LC1.code || gen( if LC.ctrl_var “!=” E.place goto L) ||S.code || gen( goto LC.next) || gen( L “:”);}

LC = ε

Page 32: Π αραγωγή Ενδιάμεσου Κώδικα

ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών 11-32

Aναδρομική Κατάβαση (backpatching)• Η πλειψηφία των σχεδίων μετάφρασης που προηγήθηκαν δεν

βασίζονται σε ορισμούς L, δηλ. απαιτούν δύο περάσματα για τη δημιουργία ενδιάμεσου κώδικα.Π.χ. δεν γνωρίζουμε που ακριβώς πρέπει να γίνει μετάβαση (goto) την στιγμή που παράγεται η αντίστοιχη εντολή:

• Το πρόβλημα μπορεί να λυθεί χωρίς να καταφύγουμε σε πολ-λαπλά περάσματα με την αναδρομική κατάβαση, η οποία συνίσταται στην κατασκευή λιστών από τις εντολές μετάβα-σης (goto, if… goto) για τις οποίες δεν είναι γνωστός ο προ-ορισμός. Όταν ο τελευταίος γίνει γνωστός, επισκεπτόμαστε τα μέλη της αντίστοιχης λίστας και συμπληρώνουμε τα αντίστοιχα πεδία.

Production Semantic RuleS = if, E, then, S1 E.true = newlabel;

E.false = S.afterS.code := E.code || gen(E.true ":") || S1.code