ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Μεταφραστές Παραγωγή ενδιάμεσου κώδικα Διδάσκων: Επικ. Καθ. Γεώργιος Μανής
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
Παραγωγή Ενδιάμεσου Κώδικα Διαλζξεις στο μάθημα: Μεταφραστζς Γιώργος Μανής
Οι Φάςεισ τησ Μεταγλώττιςησ λεκτική ανάλυση ςυντακτικι ανάλυςθ Πίνακασ Συμβόλων ςθμαςιολογικι ανάλυςθ παραγωγι ενδιάμεςου κώδικα Διαχείριςθ λακών βελτιςτοποίθςθ ενδιάμεςου κώδικα παραγωγι τελικοφ κώδικα βελτιςτοποίθςθ τελικοφ κώδικα
Παραγωγή Ενδιάμεςου Κώδικα Συντακτικό δζντρο Παραγωγι Ενδιάμεςου Κώδικα Ενδιάμεςοσ Κώδικασ
Παραγωγή Ενδιάμεςου Κώδικα Κώδηθαο ζε αξρηθή γιώζζα Κώδικασ ςε ενδιάμεςθ γλώςςα Κώδηθαο ζε γιώζζα κεραλήο (assembly)
Ενδιάμεςη Γλώςςα Ο ενδιάμεςοσ κώδικασ είναι ζνα ςφνολο από τετράδεσ ζνασ τελεςτισ τρία τελοφμενα π.χ. +, a,b,t_1 *, t_1,2,t_2 :=,t_2,_,c Οι τετράδεσ είναι αρικμθμζνεσ. Κάκε τετράδα ζχει μπροςτά τθσ ζναν μοναδικό αρικμό που τθ χαρακτθρίηει. Μόλισ τελειώςει θ εκτζλεςθ μίασ τετράδασ εκτελείται θ τετράδα που ζχει τον αμζςωσ μεγαλφτερο αρικμό, εκτόσ εάν θ τετράδα που μόλισ εκτελζςτθκε υποδείξει κάτι διαφορετικό. π.χ.: 100: +,a,b,c 110: +,d,e,f
Οι τελεςτζσ αριθμητικών πράξεων τετράδεσ τθσ μορφισ: οp, x, y, z όπου το op μπορεί να είναι ζνα εκ των: +, -, *, / τα τελοφμενα x,y μπορεί να είναι: ονόματα μεταβλθτών αρικμθτικζσ ςτακερζσ το τελοφμενο z μπορεί να είναι: όνομα μεταβλθτισ
Οι τελεςτζσ αριθμητικών πράξεων τετράδεσ τθσ μορφισ: οp, x, y, z εφαρμόηεται ο τελεςτισ op ςτα τελοφμενα x και y και το αποτζλεςμα τοποκετείται ςτο τελοφμενο z π.χ.: +,a,b,c /,a,b,c αντιςτοιχεί ςτθν πράξθ c=a+b αντιςτοιχεί ςτθν πράξθ c=a/b
Ο τελεςτήσ εκχώρηςησ τετράδεσ τθσ μορφισ: :=, x, _, z το τελοφμενο x μπορεί να είναι: όνομα μεταβλθτισ αρικμθτικι ςτακερά το τελοφμενο z μπορεί να είναι: όνομα μεταβλθτισ θ τιμι του x εκχωρείται ςτθ μεταβλθτι z αντιςτοιχεί ςτθ εκχώρθςθ z:=x
Παράδειγμα r:=4 pi:=3.14 area = pi * r * r κα μποροφςε ιςοδφναμα να είχαμε: χωρίσ να ςθμαίνει ότι αυτό ακριβώσ κα βγάλει και ο μεταγλωττιςτισ 100: :=,4,_,r 110: :=,3.14,_,pi 120: *,pi,r,t_1 130: *,Τ_1,r,area
Τελεςτήσ άλματοσ χωρίσ ςυνθήκη jump, _, _, z μεταπιδθςθ χωρίσ όρουσ ςτθ κζςθ z π.χ. 100: :=,1,_x 110: jump 130 120: :=,2,_x 130 όταν φτάςουμε ςτο 130 θ τιμι του x κα είναι 1 και όχι 2
Τελεςτήσ άλματοσ χωρίσ ςυνθήκη relop, x, y, z όπου relop ζνασ από τουσ τελεςτζσ =, >, <, <>, >=, <= μεταπιδθςθ ςτθ κζςθ z αν ιςχφει θ x relop y π.χ. 100: =,a,4,120 110: jump,_,_,140 120: :=,1,_b 130: jump 150 140: :=,2,_,b 150: το b κα ζχει τθν τιμι 1 αν ιςχφει θ ςυνκικθ a=4 και 2 αν δεν ιςχφει
Αρχή και τζλοσ ενότητασ begin_block, name, _, _ αρχι υποπρογράμματοσ ι προγράμματοσ με το όνομα name end_block, name, _, _ τζλοσ υποπρογράμματοσ ι προγράμματοσ με το όνομα name halt, _, _, _ τερματιςμόσ προγράμματοσ
Αρχή και τζλοσ ενότητασ Παράδειγμα begin_block - end_block, name - halt 100: begin_block, add, _, _ 110: :=, 1, _, x 120: :=, 2, _, y 130: +, x, y, z 140: halt, _, _, _ 150: end_block, add, _, _
Συναρτήςεισ - Διαδικαςίεσ par, x, m, _ όπου x παράμετροσ ςυνάρτθςθσ και m ο τρόποσ μετάδοςθσ CV : μετάδοςθ με τιμι REF: μετάδοςθ με αναφορά RET: επιςτροφι τιμισ ςυνάρτθςθσ call, name, _, _ κλιςθ ςυνάρτθςθσ name ret, x, _, _ επιςτροφι τιμισ ςυνάρτθςθσ
Παράδειγμα κλήςησ ςυνάρτηςησ x := foo (in a, inout b) κα μποροφςε ιςοδφναμα να είχαμε: 100: par, a, cv, _ χωρίσ να ςθμαίνει ότι αυτό ακριβώσ κα βγάλει και ο μεταγλωττιςτισ 110: par, b, ref, _ 120: par, T_1, ret, _ 130: call, foo, _, _, _ 140: τιμι ςτο x
Παράδειγμα κλήςησ διαδικαςίασ call foo (in a, inout b) κα μποροφςε ιςοδφναμα να είχαμε: 100: par, a, cv, _ χωρίσ να ςθμαίνει ότι αυτό ακριβώσ κα βγάλει και ο μεταγλωττιςτισ 110: par, b, ref, _ 120: call, foo, _, _, _ 130
Βοηθητικζσ Υπορουτίνεσ nextquad() επιςτρζφει τον αρικμό τθσ επόμενθσ τετράδασ που πρόκειται να παραχκεί genquad(op, x, y, z) δθμιουργεί τθν επόμενθ τετράδα (op, x, y, z) newtemp() δθμιουργεί και επιςτρζφει μία νζα προςωρινι μεταβλθτι οι προςωρινζσ μεταβλθτζσ είναι τθσ μορφισ T_1, T_2, T_3
Βοηθητικζσ Υπορουτίνεσ emptylist() δθμιουργεί μία κενι λίςτα ετικετών τετράδων makelist(x) δθμιουργεί μία λίςτα ετικετών τετράδων που περιζχει μόνο το x merge(list 1, list 2 ) δθμιουργεί μία λίςτα ετικετών τετράδων από τθ ςυνζνωςθ των λιςτών list 1, list 2 backpatch(list,z) θ λίςτα list αποτελείται από δείκτεσ ςε τετράδεσ των οποίων το τελευταίο τελοφμενο δεν είναι ςυμπλθρωμζνο θ backpatch επιςκζπτεται μία μία τισ τετράδεσ αυτζσ και τισ ςυμπλθρώνει με τθν ετικζτα z
Αρχή και Τζλοσ Block <PROGRAM> <PROGRAMBLOCK (name) > ::= ::= program ID <PROGRAMBLOCK (ID) <DECLARATIONS> <SUBPROGRAMS> genquad( begin_block,name, _, _ ) <BLOCK> if (this is the main program block) genquad( halt, _, _, _ ) genquad( end_block,name, _, _ )
Αριθμητικζσ Παραςτάςεισ Παράδειγμα: x+(y+z) w ενδιάμεςοσ κώδικασ: 1: +,y,z,t_1 2:,T_1,w,T_2 3: +, x, T_2, T_3
Αριθμητικζσ Παραςτάςεισ Ε -> T 1 ( + T 2 {P 1 })* {P 2 } {P 1 }: w = newtemp() Νέα πξνζωξηλή κεηαβιεηή πνπ ζα θξαηήζεη ην κέρξη ζηηγκήο απνηέιεζκα genquad( +,T 1.place,T 2.place,w) T 1.place=w Παξαγωγή ηεηξάδαο πνπ πξνζζέηεη ην κέρξη ζηηγκήο απνηέιεζκα ζην λέν Τ 2 {P 2 }: E.place=T 1.place Τν κέρξη ζηηγκήο απνηέιεζκα ηνπνζεηείηαη ζηελ T 1 ώζηε λα ρξεζηκνπνηεζεί αλ ππάξμεη επόκελν T 2 Όηαλ δελ ππάξρεη άιιν T 2 ην απνηέιεζκα είλαη ζην Τ 1
Αριθμητικζσ Παραςτάςεισ T -> F 1 ( F 2 {P 1 })* {P 2 } {P 1 }: w = newtemp() genquad(,f 1.place,F 2.place,w) F 1.place=w {P 2 }: T.place=F 1.place Αλάινγε ινγηθή κε ηνλ θαλόλα Δ
Αριθμητικζσ Παραςτάςεισ F -> ( E ) {P 1 } Απιή κεηαθνξά από ην Δ.place ζην F.place {P 1 }: F.place=E.place F -> id {P 1 } Απιή κεηαθνξά από ην id.place ζην F.place {P 1 }: F.place=id.place
Αριθμητικζσ Παραςτάςεισ procedure E (E.place) begin T ( T 1.place ) while token=plustk do begin lex(); T (T 2.place) w:=newtemp() genquad( +, T 1.place, T 2.place, w) T 1.place :=w end E.place := T 1.place end
Λογικζσ Παραςτάςεισ Ζστω η γραμματική B --> Q ( or Q )* Q --> R ( and R )* R --> ( B ) R --> E relop E
Λογικζσ Παραςτάςεισ - OR Παράδειγμα: B = x > y or x <w 100: >, x, y, _ 101: jump, _, _, 102 B.true 102: <, x, w, _ 103: jump, _, _, _ B.false
Λογικζσ Παραςτάςεισ - OR Παράδειγμα: B = x > y or x <w 100: <=, x, y, _ 101: >=, x, w, _ B.true 102: jump, _, _, _ B.false
Λογικζσ Παραςτάςεισ - OR Παράδειγμα: B = x > y or x < w or a > c 100: <=, x, y, _ B.true 101: >=, x, w, _ 102: <=, a, c, _ 103: jump, _, _, _ B.false
Λογικζσ Παραςτάςεισ - OR B -> Q 1 {P 1 } ( or {P 2 } Q 2 {P 3 })* {P 1 }: B.true = Q 1.true Μεηαθνξά ηωλ ηεηξάδωλ από ηε ιίζηα Q 1 ζηε ιίζηα Β B.false = Q 1.false {P 2 }: backpatch(b.false, nextquad()) Σπκπιήξωζε όζωλ ηεηξάδωλ κπνξνύλ λα ζπκπιεξωζνύλ κέζα ζηνλ θαλόλα {P 3 }: B.true = merge(b.true, Q 2.true) B.false = Q 2.false Η ιίζηα false πεξηέρεη ηελ ηεηξάδα ε νπνία αληηζηνηρεί ζε ζηε κε αιεζή απνηίκεζε ηεο ινγηθήο παξάζηαζεο Σπζζώξεπζε ζηε ιίζηα true ηωλ ηεηξάδωλ πνπ δελ κπνξνύλ λα ζπκπιεξωζνύλ θαη αληηζηνηρνύλ ζε αιεζή απνηίκεζε ινγηθήο παξάζηαζεο
Λογικζσ Παραςτάςεισ - AND Παράδειγμα: B = x > y and x <w 100: >, x, y, 102 101: jump, _, _, _ B.true 102: <, x, w, _ 103: jump, _, _, _ B.false
Λογικζσ Παραςτάςεισ - AND Q -> R 1 {P 1 } ( and {P 2 } R 2 {P 3 })* {P 1 }: Q.true = R 1.true Μεηαθνξά ηωλ ηεηξάδωλ από ηε ιίζηα R 1 ζηε ιίζηα Q Q.false = R 1.false {P 2 }: backpatch(q.true, nextquad()) Σπκπιήξωζε όζωλ ηεηξάδωλ κπνξνύλ λα ζπκπιεξωζνύλ κέζα ζηνλ θαλόλα {P 3 }: Q.false = merge(q.false, R 2.false) Q.true = R 2.true Η ιίζηα true πεξηέρεη ηελ ηεηξάδα ε νπνία αληηζηνηρεί ζε ζηεn αιεζή απνηίκεζε ηεο ινγηθήο παξάζηαζεο Σπζζώξεπζε ζηε ιίζηα false ηωλ ηεηξάδωλ πνπ δελ κπνξνύλ λα ζπκπιεξωζνύλ θαη αληηζηνηρνύλ ζε κε αιεζή απνηίκεζε ινγηθήο παξάζηαζεο
Λογικζσ Παραςτάςεισ R -> ( B ) {P 1 } {P 1 }: R.true=B.true Μεηαθνξά ηωλ ηεηξάδωλ από ηε ιίζηα B ζηε ιίζηα R R.false=B.false
Λογικζσ Παραςτάςεισ R -> E 1 relop E 2 {P 1 } {P 1 }: R.true=makelist(nextquad()) genquad(relop, E 1.place, E 2.place, _ ) R.false=makelist(nextquad()) genquad( jump, _, _, _ ) Γεκηνπξγία κε ζπκπιεξωκέλεο ηεηξάδαο θαη εηζαγωγή ζηε ιίζηα κε ζπκπιεξωκέλωλ ηεηξάδωλ γηα tελ αιεζή απνηίκεζε ηεο relop Γεκηνπξγία κε ζπκπιεξωκέλεο ηεηξάδαο θαη εηζαγωγή ζηε ιίζηα κε ζπκπιεξωκέλωλ ηεηξάδωλ γηα tε κε αιεζή απνηίκεζε ηεο relop
Κλήςη Υποπρογραμμάτων Κλήση διαδικασίας: call assign_v (in a, inout b) par, a, CV, _ par, b, REF, _ call, assign_v, _, _
Κλήςη Υποπρογραμμάτων Κλήση συνάρτησης: error = assign_v (in a, inout b) par, a, CV, _ par, b, REF, _ w = newtemp() par, w, RET, _ call, assign_v, _, _
Εντολή return S -> return (E) {P1} {P1}: genquad( retv,e.place, _, _ )
Εκχώρηςη S -> id := E {P1}; {P1} : genquad( :=,E.place, _,id)
Δομή while S -> while {P1} B do {P2} S 1 {P3} {P1}: {P2}: {P3}: Bquad:=nextquad() backpatch(b.true,nextquad()) genquad( jump, _, _,Bquad) backpatch(b.false,nextquad()) Σπκπιήξωζε ηωλ ηεηξάδωλ πνπ έρνπλ κείλεη αζπκπιήξωηεο θαη θαη γλωξίδνπκε ηώξα όηη πξέπεη λα ζπκπιεξωζνύλ κε ηελ επόκελε ηεηξάδα, ην true πάλω ζηελ S θαη ην false έμω από ηε δνκή Μεηάβαζε ζηελ αξρή ηεο ζπλζήθεο ώζηε λα μαλαγίλεη έιεγρνο
Δομή Repeat Until S -> repeat {P1} S 1 until (cond) {P2} {P1}: squad:=nextquad() {P2}: backpatch(cond.false,squad) backpatch(cond.true,nextquad()) Οη ηεηξάδεο απηέο πξέπεη λα κεηαβνύλ ζηελ αξρή ηεο ζπλζήθεο γηα λα επαλειεγρζεί Σπκπιήξωζε ηωλ ηεηξάδωλ πνπ έρνπλ κείλεη αζπκπιήξωηεο θαη θαη γλωξίδνπκε ηώξα όηη πξέπεη λα ζπκπιεξωζνύλ κε ηελ επόκελε ηεηξάδα, δειαδή έμω από ηε δνκή
Δομή if S -> if B then {P1} S 1 {P2} TAIL {P3} {P1}: backpatch(b.true,nextquad()) {P2}: iflist=makelist(nextquad()) genquad( jump, _, _, _ ) backpatch(b.false,nextquad()) {P3}: backpatch(iflist,nextquad()) TAIL -> else S 2 TAIL -> ε Σπκπιήξωζε ηωλ ηεηξάδωλ πνπ έρνπλ κείλεη αζπκπιήξωηεο θαη θαη γλωξίδνπκε ηώξα όηη πξέπεη λα ζπκπιεξωζνύλ κε ηελ επόκελε ηεηξάδα, ζην if θαη else αληίζηνηρα Δμαζθαιίδνπκε όηη εάλ εθηειεζηνύλ νη εληνιέο ηνπ if δε ζα εθηειεζηνύλ ζηε ζπλέρεηα νη εληνιέο ηνπ else
Είςοδοσ - Ζξοδοσ S -> input (id) {P1} {P1}: genquad( inp,id.place, _, _ ) S -> print (E) {P2} {P2}: genquad( out,e.place, _, _ )
Τέλος Ενότητας
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σημειώματα
Σημείωμα Ιστορικού Εκδόσεων Έργου Το παρόν έργο αποτελεί την έκδοση 1.0. Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 1.0 διαθέσιμη εδώ. http://ecourse.uoi.gr/course/view.php?id=1125.
Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Επικ. Καθ. Γεώργιος Μανής. «Μεταφραστές. Παραγωγή ενδιάμεσου κώδικα». Έκδοση: 1.0. Ιωάννινα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http://ecourse.uoi.gr/course/view.php?id=1125.
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1] https://creativecommons.org/licenses/by-sa/4.0/