Μεταγλωττιστές. Παραγωγή Ενδιάμεσου Κώδικα. Εργαστήριο 8. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Σχετικά έγγραφα
Γλώσσες Προγραμματισμού Μεταγλωττιστές

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 9 ο

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ.

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 8 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Παραγωγή Ενδιάµεσου Κώδικα. Γιώργος Μανής

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

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

Runtime Checking (1/3) Runtime Checking (2/3) Runtime Checking (3/3) ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

HY340, 2009 Α. Σαββίδης Slide 2 / 143. HY340, 2009 Α. Σαββίδης Slide 3 / 143. HY340, 2009 Α. Σαββίδης Slide 4 / 143

Μεταγλωττιστές. Εργαστήριο 5. Εισαγωγή στο BISON. Γεννήτρια Συντακτικών Αναλυτών. 2 η Φάση Μεταγλώττισης Συντακτική Ανάλυση

Δομημένος Προγραμματισμός (ΤΛ1006)

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

Μεταγλωττιστές Βελτιστοποίηση

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 1 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Γλώσσες Προγραμματισμού Μεταγλωττιστές

ΗΥ-150. Προγραμματισμός

ΗΥ-150. Προγραμματισμός

a = false; else a = 3.33; b = (a and c); //?

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή

Μεταγλωττιστές Βελτιστοποίηση

Εισαγωγή στον Προγραμματισμό

Ανάπτυξη και Σχεδίαση Λογισμικού

Μεταγλωττιστής. Μεταφραστές. Γλώσσες. Είδη Μεταγλωττιστών. Μεταγλωττιστής Τελικό πρόγραµµα (object program) Εισαγωγή Αρχικό πρόγραµµα (source program)

Φροντιστήριο. Παραγωγή τελικού κώδικα. Παραγωγή τελικού κώδικα

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Αντίρριο, 14/03/2017 Προδιαγραφές Εργαστηριακής Εργασίας για το μάθημα «Μεταγλωττιστές»

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL) (PASCAL ) Μεταβλητές- Τύποι- Τελεστές

Σχεδίαση Γλωσσών Προγραμματισμού Συντακτική Ανάλυση ΙII. Εαρινό Εξάμηνο Lec 11 26/03/2019 Διδάσκων: Γεώργιος Χρ. Μακρής

Γλώσσες Προγραμματισμού Μεταγλωττιστές. Σημασιολογική Ανάλυση

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

οµές Επιλογής Εντολές if και switch

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Γλώσσες Προγραμματισμού Μεταγλωττιστές

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Η γλώσσα προγραμματισμού EEL

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Δομές Δεδομένων (Data Structures)

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση

Η γλώσσα προγραμματισμού Strange

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

Μεταγλωττιστές. Συντακτικός Αναλυτής Κατασκευή Πίνακα Συμβόλων (ΠΣ) Εργαστήριο 7. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Ανάπτυξη και Σχεδίαση Λογισμικού

Στοιχειώδης προγραμματισμός σε C++

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

ιαδικαστικός Προγραμματισμός

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

ΚΕΦΑΛΑΙΟ 6: Γλώσσες. 6.1 Ιστορική εξέλιξη 6.4 Υλοποίηση γλώσσας. Κεφάλαιο 6: «Γλώσσες Προγραµµατισµού»

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

Pascal, απλοί τύποι, τελεστές και εκφράσεις

Τύποι δεδομένων, τελεστές, μεταβλητές

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Πληροφορική ΙΙ Θεματική Ενότητα 5

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Προγραμματισμός Ι. Θεματική ενότητα 3: Tελεστές. εκφράσεις

Οργάνωση επεξεργαστή (1 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

procedure P ( < pars > ) < type> f( < pars > ) begin { < local vars > < local vars > < procedure body> < procedure body> end; }

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΗΥ340

Δομημένος Προγραμματισμός (ΤΛ1006)

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Θέματα Μεταγλωττιστών

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στις βασικές έννοιες που σχετίζονται με τη λεξική ανάλυση. Στη δήλωση ορισμό κανονικών εκφράσεων

Εργαστήριο 08 Εισαγωγή στo Yacc

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 11 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

a = 10; a = k; int a,b,c; a = b = c = 10;

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

Εισαγωγή στη γλώσσα προγραμματισμού C++

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Λογισμικό Συστήματος. Κλειώ Σγουροπούλου

Κεφάλαιο 7: Υπορουτίνες

Υλοποίηση ΣΑ με το bison

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Προγραμματισμός Ι (ΗΥ120)

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Δομημένος Προγραμματισμός

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Transcript:

Μεταγλωττιστές Εργαστήριο 8 Παραγωγή Ενδιάμεσου Κώδικα Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι 2016-2017

Παραγωγή Ενδιάμεσου Κώδικα Source Ο ενδιάμεσος κώδικας αποτελεί τη γλώσσα επικοινωνίας ανάμεσα στο εμπρόσθιο και οπίσθιο τμήμα ενός μεταγλωττιστή. Ο χωρισμός σε εμπρόσθιο και ενδιάμεσο τμήμα επιτρέπει: Τη δημιουργία μεταγλωττιστών για νέες αρχιτεκτονικές με αλλαγή μόνο του οπίσθιου τμήματος. Τη βελτιστοποίηση στο επίπεδο της αφηρημένης μηχανής του ενδιάμεσου κώδικα. Front Lexical Analyzer Syntax Analyzer Semantic Analyzer Intermediate code Generator Τυπικά ο ενδιάμεσος κώδικας παράγεται από μία μετάφραση κατευθυνόμενη από τη σύνταξη. Back Code Optimizer Code Generator Target

Ενδιάμεσες Γλώσσες Η γλώσσα στην οποία εκφράζεται ο ενδιάμεσος κώδικας πρέπει: Να είναι ικανή να εκφράσει τις λειτουργίες των γλωσσών υψηλού επιπέδου. Να είναι δυνατό να μεταφραστεί εύκολα και αποδοτικά (δηλ. να μπορεί να εκμεταλλευτεί πρόσθετες δυνατότητες) στην εκάστοτε γλώσσα μηχανής. Συνήθως χρησιμοποιούνται οι εξής ενδιάμεσες γλώσσες: Επιθεματικός κώδικας Κώδικας τριών διευθύνσεων Αφηρημένα συντακτικά δένδρα ή γράφοι C Pascal Fortran Intermediate code x86 MIPS Sparc Prolog PPC

Γραφικές Ενδιάμεσες Γλώσσες Αφηρημένα συντακτικά δένδρα (AST): συντακτικά δένδρα στα οποία δεν υπάρχουν μη-τερματικά σύμβολα. Ακυκλικοί κατευθυνόμενοι γράφοι (DAG): προκύπτουν με τροποποίηση των συναρτήσεων mknode & mkleaf, της μετάφρασης που παράγει το AST (απαλειφή κοινών υποεκφράσεων). Παράδειγμα: a = b * - c + b * - c assign assign a + a + AST * * * DAG b uminus c b uminus c b uminus c

Επιθεματικός Κώδικας Ο επιθεματικός κώδικας (postfix notation) είναι μία γραμμική αναπαράσταση του αφηρημένου συντακτικού δένδρου. Σχηματίζεται τοποθετώντας τους κόμβους του δένδρου σε μία λίστα, ώστε ένας κόμβος να εμφανίζεται αμέσως μετά τα παιδιά του. Για το προηγούμενο παράδειγμα: a b c uminus * b c uminus * + assign H λειτουργία του βασίζεται στην ύπαρξη μίας στοίβας στο οποίο τοποθετούνται όλοι οι κόμβοι. Η τοποθέτηση ενός τελεστή πυροδοτεί την εκτέλεσή του, την αφαίρεση των ορισμάτων του από τη στοίβα και την τοποθέτηση του αποτελέσματος. Η στοίβα περιορίζει τις δυνατές βελτιστοποιήσεις καθώς ελαττώνει τις δυνατές τροποποιήσεις στη θέση των κόμβων.

Κώδικας Τριών Διευθύνσεων (ΚΤΔ) Ένας τελεστής σε κάθε εντολή. Ο κώδικας τριών διευθύνσεων (ΚΤΔ) αποτελείται από εντολές της μορφής: x := y op z όπου x, y, z είναι ονόματα μεταβλητών, σταθερές ή βοηθητικές μεταβλητές που δημιουργεί ο μεταγλωττιστής. Τρεις διευθύνσεις οι οποίες αντιπροσωπεύουν τα ορίσματα και το αποτέλεσμα του τελεστή. Παράδειγμα: Έκφραση: w = x + y*z Κώδικας τριών διευθύνσεων: $1 = y * z w= x + $1 t1 := y * z t2 := x + t1 w := t2

Κώδικας Τριών Διευθύνσεων (ΚΤΔ) Περιέχει δύο "κλάσεις" αντικειμένων: διευθύνσεις και εντολές addresses and instructions Ο κώδικας "γράφεται" είτε με την μορφή τριάδων είτε με την μορφή τετράδων. Δεν προβλέπει μια μεταβλητή στην οποία ανατίθεται το αποτέλεσμα της πράξης αλλά το αποτέλεσμα αναφέρεται από την αριθμητική ετικέτα της εντολής. Στο προηγούμενο παράδειγμα w=x+y*z 100: *,y,z 110: +,x,(100) 120: =,w,(110)

Τύποι εντολών ΚΤΔ Εντολές ανάθεσης (assignment) x := y op z x := op y (μοναδιαίος τελεστής) x := y (αντιγραφή) Eντολές διακλάδωσης με και χωρίς συνθήκη goto L (όπου L ετικέτα) if x relop y goto L (όπου relop σχεσιακός τελεστής: <, =, κλπ) Ετικέτες L: ή label L

Τύποι εντολών ΚΤΔ Κλήσης διαδικασιών param x call p, n return y τοποθέτηση της παραμέτρου x στη στοίβα κλήση της διαδικασίας p με n παραμέτρους επιστροφή της τιμής y Π.χ. για την κλήση της διαδικασίας p(x1, x2,, xn): param x1 param x2 call p, n Εντολές προσπέλασης πινάκων x := y[i] x[i] := y θέσε το x ίσο με τα περιεχόμενα της θέσης μνήμης που βρίσκεται σε απόσταση i από τη θέση y

Τύποι εντολών ΚΤΔ Εντολές δεικτών και διευθυνσιοδότησης (pointers & addressing) x := &y δώσε στο x την διεύθυνση του y x := *y δώσε στο x τα περιεχόμενα της διεύθυνση που περιέχεται στο y *x := y Παράδειγμα: if (x == 0) then y=1 else y=3 if x = 0 goto L1 y := 3 goto L2 L1: y := 1 L2:

Γλώσσα των Τετράδων Κάθε εντολή αποτελείται από μια αριθμητική ετικέτα, το τελεστή op και τρία τελούμενα (ορίσματα του τελεστή) x,y,z, δηλαδή: n: op, x,y,z Για παράδειγμα η πρόσθεση w = x+$1 γίνεται: 100:+,x,$1,w Σε περίπτωση που ο τελεστής έχει λιγότερα από δύο ορίσματα, τότε τα αντίστοιχα πεδία της τετράδας παραμένουν κενά. Παράδειγμα: 110: -, s, -, w (w=-s). Το προηγούμενο παράδειγμα: w=x+y*z 100: *,y,z,$1 110: +,x,$1,w Ετικέτα t1, t2.

Άλλες Παράμετροι Ετικέτα Τετράδας, που χρησιμοποιείται για την πραγματοποίηση άλματος Ετικέτα εντολής, για πραγματοποίηση αλμάτων με εντολή GOTO. Τρόπος περάσματος παραμέτρων, κατά αξία V ή κατά αναφορά R. Άγνωστη ετικέτα τετράδας (*), που δηλώνει ότι η ετικέτα δεν είναι γνωστή ακόμη και θα συμπληρωθεί αργότερα με την διαδικασία bakcpatching.

Εντολές unit,i,-,- και endu,i,-,- Έναρξη και τέλος δομικής μονάδας Ι op,x,y,z όπου op είναι +,-,*,/,% και αντιστοιχεί στην εκτέλεση της πράξης op στα τελούμενα x,y και αποθήκευση αποτελέσματος στο z. -,x,-,z Υλοποίηση αρνητικού προσήμου (z =-x) :=,x,-,z Εντολή ανάθεσης το z παίρνει τη τιμή του x. array,x,y,z Επιστρέφει στο z ένα δείκτη στο y-ιοστό στοιχείο του πίνακα x.

Παράδειγμα v=x + y*z + w + 3 100: 110: 120: 130: 140: *,y,z,$1 +,x,$1,$2 +,$2,w,$3 +,$3,3,$4 :=,$4,-,v v = -r + 18 100: 110: 120: -,r,-,$1 +,$1,18,$2 :=,$2,-,v

Εντολές Άλματος jump,-,-,z Η εντολή πραγματοποιεί άλμα στην τετράδα με ετικέτα z (αριθμητική ετικέτα) label,l,-,- Ορίζει μια ετικέτα εντολής με το όνομα l. jumpl,-,-,l Η εντολή πραγματοποιεί άλμα στην τετράδα με ετικέτα εντολής l (που πρέπει να ορίζεται όπως παραπάνω) op,x,y,z όπου op <,>,=,<=,>=. Η εντολή πραγματοποιεί τετράδα με ετικέτα z, αν αληθεύει το x opy. ifb,x,-,z Αν αληθεύει η bolean x τότε γίνεται άλμα στην ετικέτα z. άλμα (υπό συνθήκη) στην

Εντολές υποπρογραμμάτων call,-,-,i κλήση του υποπρογράμματος Ι par,x,v,- par,x,r,- par,x,ret,- (κατά αξία) (κατά αναφορά) (θέση στην οποία επιστρέφεται αποτέλεσμα) Εντολές δήλωσης παραμέτρων, που πρέπει να υπάρχουν πριν από την εντολή call,-,-,i. ret,-,-,- εντολή επιστροφής από την συνάρτηση πρίν ο έλεγχος φτάσει στη τριάδα endu.

Παραγωγή Ενδιάμεσου Κώδικα Η παραγωγή του ενδιάμεσου κώδικα γίνεται με την τεχνική της μετάφρασης οδηγούμενης από τη σύνταξη. Διευρυμένη γραμματική χωρίς συμφραζόμενα με ιδιότητες και σημασιολογικές ρουτίνες. Η συντακτική ανάλυση και η παραγωγή ενδιάμεσου κώδικα γίνονται ταυτόχρονα. Στους LR συντακτικούς αναλυτές οι σημασιολογικές ρουτίνες πρέπει να είναι στο τέλος του κανόνα. S ::= A {SR1} B {SR2} γίνεται: S::=A P1 B {SR2} P1 ::={SR1}

Παράδειγμα Μετάφρασης Εντολής Ανάθεσης S ::= "id" ":=" E ; E ::= E1 "+" E2 E ::= "-" E1 E ::= "(" E1 ")" E ::= "id" {p = lookup(id.lexeme); if p!= null then genquad('=',e.place,-,p) else error} {E.place = newtemp(e.type) genquad('+',e1.place, E2.place, E.place) } E ::= E1 "*" E2 {E.place = newtemp(e.type); genquad('*',e1.place, E2.place, E.place)} {E.place = newtemp(e.type); genquad('-',e1.place,-,e.place) } {E.place = E1.place} {p = lookup(id.lexeme); if p!= null then E.place = p else error}

Επεξήγηση Για την συγκεκριμένη υλοποίηση υπάρχουν οι ακόλουθες ιδιότητες: place: περιέχει τη θέση του αντικειμένου στην οποία βρίσκεται μια τιμή. Είναι δηλαδή η διεύθυνση της μεταβλητής. type: ο τύπος στον οποίο ανήκει μια τιμή. Οι συναρτήσεις που χρησιμοποιούνται είναι οι ακόλουθες: genquad(op,x,y,z): παράγει μια νέα τετράδα εντολής με τα τέσσερα ορίσματα. newtemp: Δημιουργεί μια νέα μεταβλητή συγκεκριμένου τύπου Οι προσωρινές μεταβλητές είναι της μορφής t_1, t_2, t_3

Μετάφραση Σύνθετων Εντολών block::= "begin" stmts "end {block.nextlist = smts.nextlist;} stmts::= stmt ';' {stmts.nextlist = stmt.nextlist;} stmts::= stmt ';' {backpatch(stmt.nextlist, nextquad);} stmts2 {stmts.nextlist = stmts2.nextlist;} Η S.nextlist θα χρησιμοποιηθεί σε εντολή backpatching όταν γίνει γνωστή η επόμενη τετράδα που ακολουθεί. Η ετικέτα δεν είναι γνωστή και θα συμπληρωθεί αργότερα με την διαδικασία backpatching

Μετάφραση Λογικών Εκφράσεων Λογικές εκφράσεις έχουν δύο ρόλους: περιγράφουν μια λογική τιμή η οποία μπορεί να ανατεθεί σε μια μεταβλητή τύπου boolean. Στην περίπτωση αυτή οι τιμές μπορεί να είναι true/false. πχ. s = a and b or c αποτελούν συνθήκες σε εντολές αλλαγής ροής ελέγχου (διακλάδωσης). πχ. if a and b or c then S Υπολογισμός τιμής λογικών εκφράσεων: Αποδίδεται στην έκφραση η τιμή 0 (false) ή 1 (true) και οι πράξεις γίνονται όπως οι αριθμητικές πράξεις. Χρησιμοποιείται όταν το αποτέλεσμα αποθηκεύεται σε μια μεταβλητή.

Μετάφραση Λογικών Εκφράσεων Κάθε λογική έκφραση συνδέεται με αντίστοιχες μεταβάσεις που δηλώνουν που θα μεταφερθεί ο έλεγχος αν η έκφραση είναι αληθής ή ψευδής. Ο αριθμός της τετράδας για μετάβαση στην περίπτωση true αποδίδεται ως τιμή στις αντίστοιχες εντολές άλματος του μεταφρασμένου κώδικα. Οι θέσεις των εντολών αυτών αποθηκεύονται σεαντίστοιχη (ομώνυμη) μεταβλητή του συμβόλου (truelist) για χρήση με την διαδικασία backpatching. Με παρόμοιο τρόπο ορίζεται ο κώδικας στη περίπτωση false. Οι μεταβάσεις αποθηκεύονται στη μεταβλητή falselist.

Παράδειγμα Γραμματικής Λογική Διάζευξη Η τεχνική λέγεται short-circuit. B::=B1"or"B2 { backpatch(b1.falselist;nextquad);} {B.truelist := merge(b1.truelist;b2.truelist); B.falselist := B2.falselist } falselist Β 1 truelist falselist Β 2 truelist falselist truelist

Backpatching Όπως είναι φανερό από το προηγούμενο παράδειγμα η Β1 μπορεί να χρειάζεται για τη μετάφραση της αυθαίρετα μεγάλο αριθμό τετράδων. Σε κάποιες από αυτές τις τετράδες, "βεβαιώνεται" ότι η τιμή της Β1 είναι false και πρέπει να γίνουν τα αντίστοιχα άλματα. Δεν είναι γνωστό κατά τη δημιουργία των τετράδων το που (τετράδα αμέσως μετά εκείνες της Β1)! backpatching: Ανατρέχει τις αποθηκευμένες τιμές στη λίστα (truelist/falselist) όταν είναι γνωστή η τιμή και θέτει τις ανάλογες τιμές (τετράδες jump)

Συντακτικά Δένδρα Το συντακτικό δένδρο που μπορεί να κατασκευάσει ο συντακτικός αναλυτής ονομάζεται συμπαγές συντακτικό δένδρο (concrete syntax tree CST ). Αφηρημένο συντακτικό δένδρο (abstract syntax tree AST ) είναι μία συμπυκνωμένη abstract μορφή του συμπαγούς συντ. Δένδρου όπου δεν υπάρχουν μη-τερματικοί κόμβοι. Παράδειγμα: Program: a + b *c CST E AST + Grammar: E E * E E + E id E + E id E * E id * id id id id

Κατασκευή αφηρημένου συντακτικού δένδρου Τα AST προσφέρουν ένα μηχανισμό απαγκίστρωσης των επόμενων σταδίων μεταγλώττισης από την συντακτική ανάλυση. Οι εσωτερικοί κόμβοι ενός AST αναπαριστούν τελεστές και οι κόμβοιαπόγονοί τους τους τελεστέους ή τα ορίσματα πάνω στα οποία δρούν. Για την κατασκευή ενός AST για αριθμητικές εκφράσεις μπορούν να χρησιμοποιηθούν οι ακόλουθες συναρτήσεις σε συνδυασμό με ένα ορισμό κατευθυνόμενο από την σύνταξη και παραγόμενα χαρακτηριστικά: mknode(op, left, right) mkleaf(id, entry): κόμβος για μεταβλητή τοποθετημένη στη θέση entry του πίνακα συμβόλων. mkleaf(num, val) : κόμβος για σταθερά με τιμή val.

Δημιουργία ΑST H δημιουργία γίνεται με την βοήθεια μετάφρασης οδηγούμενη από τη σύνταξη. Π.χ. Production Semantic Rule S = id, ":=", E S.nprt = mknode("assign", mkleaf(id,id.place), E.nptr) E = E 1, "+", E 2 E.nprt = mknode("+", E 1.nptr, E 2.nptr) E = E 1, "*", E 2 E.nprt = mknode("*", E 1.nptr, E 2.nptr) E = "-", E 1 E.nprt = mkunode("uminus", E 1.nptr) E = "(", E 1, ")" E.nprt = E 1.nptr E = id E.nprt = mkleaf(id,id.place) To ΑST που δημιουργείται για την έκφραση a-4+c: + - id c.entry Bison: E : E '+' E { $$ = mknode('+', $1, $3);} id a.entry num 4

Bison: Δημιουργία ΑST + - id id a.entry num 4 c.entry Structures!!! Παράδειγμα: Γραμματικό Συντακτικό Κανόνα decl : basic_type idents ; ; Idents : idents, ident ident ; Ident : ID ; decl: basic_type idents ; {$$ = function($1, $2);} Υλοποίηση και εκτέλεση κατά την συντακτική ανάλυση χρησιμοποιώντας και τις σημασιολογικές τιμές

Bison: Δημιουργία ΑST- Παράδειγμα Exp : exp RELATIONAL exp { $$ = new_ast_relational_node ($2, $1, $3); } exp EQUALITY exp { $$ = new_ast_equality_node ($2, $1, $3); } exp '+' exp { $$ = new_ast_exp_node ('+', $1, $3); } exp '-' exp { $$ = new_ast_exp_node ('-', $1, $3);} Bison exp '*' exp { $$ = new_ast_exp_node ('*', $1, $3); } exp '/' exp { $$ = new_ast_exp_node ('/', $1, $3); } '(' exp ')' { $$ = $2; } '-' exp %prec UMINUS { $$ = new_ast_exp_node ('M', $2, NULL); } NUMBER { $$ = new_ast_number_node ($1); } NAME { $$ = new_ast_symbol_reference_node ($1); } NAME '=' exp { $$ = new_ast_assignment_node ($1, $3); } NAME '(' ')' { $$ = new_ast_function_node ($1, NULL); } NAME '(' exp_list ')' { $$ = new_ast_function_node ($1, $3); } ; Ορίζουμε για το AST μια δομή (struct) για τους κόμβος μια κοινή δομή που καλύπτει όλες τις ανάγκες του AST Ποιες είναι οι ανάγκες του AST? Δημιουργούμε συνδέσεις «με pointers» Struct: Θα πρέπει να μπει ο κωδικός του τελεστή για τους κόμβους έκφρασης Θα πρέπει να μπει ο κωδικός της εντολής για τους κόμβους εντολής.. Κάποιο πεδίο για τον τύπο του κόμβο Όνομα μεταβλητής, τιμή σταθεράς.. #include tree.c ή Gcc lex.c tab.c tree.c

Bison: Δημιουργία ΑST- Παράδειγμα struct ast_node * new_ast_exp_node (int node_type, struct ast_node * left, struct ast_node * right) { struct ast_exp_node * ast_node = malloc (sizeof (ast_node)); ast_node->node_type = node_type; ast_node->left = left; ast_node->right = right; return ast_node; } $$= new_ast_exp_node ('*', $1, $3); } Tree.c #include tree.h" struct ast_node // for binary/unary operators and expression lists { int node_type; struct ast_node * left; struct ast_node * right; }; Tree.h

Bison: Δημιουργία ΑST- Παράδειγμα struct ast_node * new_ast_symbol_reference_node (struct symbol_node * symbol) { struct ast_symbol_reference_node * ast_node = ast_node->node_type = 'S'; ast_node->symbol = symbol; return (struct ast_node *) ast_node; } Tree.c malloc (sizeof (ast_symbol_reference_node)); $$ = new_ast_symbol_reference_node ($1); struct ast_symbol_reference_node // for symbol references { int node_type; struct symbol_node * symbol; }; Tree.h

Άλλες δομές κόμβων ΑST- Παράδειγμα struct ast_relational_node // for relational operators { int node_type; enum relational_operator operator; struct ast_node * left; struct ast_node * right; }; struct ast_equality_node // for equality operators { int node_type; enum equality_operator operator; struct ast_node * left; struct ast_node * right; }; struct ast_function_node // for function calls { int node_type; struct ast_node * arguments; struct symbol_node * symbol; }; Χρήση ενός struct Tree.h enum relational_operator{ LESS, LESS_OR_EQUAL, GREATER, GREATER_OR_EQUAL}; enum equality_operator { EQUAL, NOT_EQUAL}; Tree.h struct ast_node * new_ast_relational_node (enum relational_operator operator, struct ast_node * left, struct ast_node * right) { struct ast_relational_node * ast_node = malloc (sizeof (struct ast_relational_node)); ast_node->node_type = 'R'; ast_node->operator = operator; ast_node->left = left; ast_node->right = right; return (struct ast_node *) ast_node; } Tree.c

Instruction Nodes (statement: if) selection_statement : IF '(' expression ')' statement %prec NO_ELSE {$$ = new_ast_if_node ($3, $5, NULL); } IF '(' expression ')' statement ELSE statement { $$ = new_ast_if_node ($3, $5, $7); } ; struct ast_if_node // for "if/else" statements { int node_type; struct ast_node * condition; struct ast_node * if_branch; struct ast_node * else_branch; }; struct ast_node * new_ast_if_node (struct ast_node * condition, struct ast_node * if_branch, struct ast_node * else_branch) { struct ast_if_node * ast_node = malloc (sizeof (struct ast_if_node)); ast_node->node_type = 'IF'; ast_node->condition = condition; ast_node->if_branch = if_branch; ast_node->else_branch = else_branch; return (struct ast_node *) ast_node; }

Instruction Nodes (statement: while) iteration_statement : WHILE '(' expression ')' statement { $$ = new_ast_while_node ($3, $5); } ; struct ast_while_node // for "while" statements { int node_type; struct ast_node * condition; struct ast_node * while_branch; }; struct ast_node * new_ast_while_node (struct ast_node * condition, struct ast_node * while_branch) { struct ast_while_node * ast_node = malloc (sizeof (struct ast_while_node)); ast_node->node_type = 'W'; ast_node->condition = condition; ast_node->while_branch = while_branch; return (struct ast_node *) ast_node; }

Εργαστηριακή Άσκηση Τροποποιήστε κατάλληλα το προηγούμενο παράδειγμα με σκοπό την κατασκευή ενός AST για τις αριθμητικές εκφράσεις που υλοποιεί το συντακτικό αναλυτή της Προχωρημένης Αριθμομηχανής του 6 ου Εργαστηρίου Να γίνει διαπέραση του AST ώστε να υπολογίζεται η τιμή της έκφρασης [a=5; C = a+6*7+12/2-5](χρησιμοποιώντας ένα πεδίο πχ value στον κόμβο του AST για αυτό το σκοπό)