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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

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

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

Κεφάλαιο 4 Σημασιολογία μιας Απλής Προστακτικής Γλώσσας

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

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

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

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

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

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

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

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

Δομές ελέγχου ροής προγράμματος

Προγραμματισμός PASCAL

ΘΠ06 Μεταγλωττιστές. Εργασία Εξαμήνου: Υλοποίηση ενός Μεταγλωττιστή για τη Γλώσσα Floop2009

Στόχοι και αντικείμενο ενότητας. Βασικές κατασκευές ΓΠ. Έλεγχος ροής προγράμματος. #4.. Εντολές Επιλογής

Πίνακας Περιεχοµένων Πρόλογος Κεφάλαιο Βασικές εισαγωγικές έννοιες

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

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

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

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

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

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

Προγραμματισμός Ι (HY120)

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

Μεταγλωττιστές. Δημήτρης Μιχαήλ. Ακ. Έτος Ανοδικές Μέθοδοι Συντακτικής Ανάλυσης. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΛΑΜΙΑΣ. A. Μετατροπή αριθμών 1. Μετατροπή αριθμών από δεκαδικό σε δυαδικό σύστημα αρίθμησης

2.1. Εντολές Σχόλια Τύποι Δεδομένων

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

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

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

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

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

Διάλεξη 1. Πράξεις Τελεστές Έλεγχος Ροής

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

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

Προγραμματισμός I (Θ)

Ανάλυση της Ορθότητας Προγραμμάτων (HR Κεφάλαιο 4)

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Δομή Επιλογής. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Προγραμματισμός PASCAL

Ψευδοκώδικας. November 7, 2011

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

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

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

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

Σχολικό Βιβλίο - Κεφάλαιο 7 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PASCAL ΠΑΡΟΥΣΙΑΣΗ 13

Βασικά Στοιχεία της Java

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην αναγκαιότητα ύπαρξης των μεταγλωττιστών

3. Εκφράσεις και έλεγχος ροής

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Είδη εντολών. Απλές εντολές. Εντολές ελέγχου. Εκτελούν κάποια ενέργεια. Ορίζουν τον τρόπο με τον οποίο εκτελούνται άλλες εντολές

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

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

Περιεχόμενα. Πρόλογος... 21

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

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

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

Απάντηση: (func endfunc)-([a-za-z])+

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

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Ρητή μετατροπή αριθμητικής τιμής σε άλλο τύπο. Τι θα τυπωθεί στον παρακάτω κώδικα;

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

Transcript:

Γλώσσες Προγραμματισμού Μεταγλωττιστές Παραγωγή Ενδιάμεσου Κώδικα Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου

Δομή Παραγωγή ενδιάμεσου κώδικα. Ενδιάμεσες γλώσσες. Αφηρημένα συντακτικά δένδρα Προθεματικός και επιθεματικός κώδικας Κώδικας τριών διευθύνσεων Γλώσσα τριάδων και τετράδων. Σχήματα οδηγούμενα από τη σύνταξη. Λογικές Εκφράσεις Backpatching Εντολές διακλάδωσης υπο συνθήκη Εντολή while-do

Φάσεις Μεταγλώττισης Αρχικό Πρόγραμμα Λεκτική Ανάλυση λεκτικές μονάδες Πίνακας Συμβόλων Τελικό Πρόγραμμα Συντακτική Ανάλυση συντακτικό δένδρο Σημασιολογική Ανάλυση συντακτικό δένδρο Παραγωγή Ενδιάμεσου Κώδικα ενδιάμεσος κώδικας Βελτιστοποίηση Ενδιάμεσου Κώδικα ενδιάμεσος κώδικας Παραγωγή Τελικού Κώδικα τελικός κώδικας Βελτιστοποίηση Τελικού Κώδικα Χειριστής Σφαλμάτων

Παραγωγή Ενδιάμεσου Κώδικα Στην συνηθέστερη περίπτωση ο μεταγλωττιστής παράγει ενδιάμεσο κώδικα. Ενδιάμεσος κώδικας είναι εκφρασμένος σε μια γλώσσα χαμηλότερου επιπέδου από την αρχική, αλλά υψηλότερου επιπέδου από τη γλώσσα μηχανής. Λόγος Διαχωρισμός εμπρόσθιου (front-end) και οπίσθιου μέρους (back-end) του μεταγλωττιστή, άρα διευκόλυνση υλοποίησης μεταγλωττιστών. Επαναχρησιμοποίηση κώδικα. Ευκολότερη μετάφραση. Ευκολότερη βελτιστοποίηση κώδικα.

Ενδιάμεσες Γλώσσες Η επιλογή της γλώσσας είναι ευθύνη του κατασκευαστή του μεταγλωττιστή. Δεν υπάρχει συγκεκριμένο πρότυπο. Απαιτείται μια γλώσσα που: Να προσφέρει εύκολη μετάφραση από την αρχική γλώσσα υψηλού επιπέδου. Εύκολη μετάφραση στη τελική γλώσσα μηχανής. Προσφέρει ευκολία στις βελτιστοποιήσεις. Γλώσσες που έχουν προταθεί: Αφηρημένα συντακτικά δένδρα Προθεματικός και επιθεματικός κώδικας Τριάδες και τετράδες εντολών.

Αφηρημένα Συντακτικά Δένδρα Παρόμοια με τα συντακτικά δένδρα, αλλά περισσότερο συμπαγή. Τελεστές τοποθετούνται στους ενδιάμεσους κόμβους και τα τελούμενα στα φύλλα του δένδρου. - πχ b*b-4*a*c Δυνατότητα γραμμικής * * αναπαράστασης: b b * -(*(b,b),*(*(4,a),c)) 4 a c

Κατευθυνόμενοι Ακυκλικοί Γράφοι Οι κατευθυνόμενοι ακυκλικοί γράφοι αποτελούν μια παραλλαγή των αφηρημένων συντακτικών δένδρων. Ενοποίηση κοινών υποδένδρων. Είναι μια πρώτη μορφή βελτιστοποίησης. πχ. έκφραση a+a*(b-c)+(b-c)*d + a * - + * da b c

Προθεματικός και Επιθεματικός Κώδικας Στον προθεματικό κώδικα ο τελεστής εμφανίζεται πριν τα τελούμενα, ενώ στον επιθεματικό μετά. Δεν χρησιμοποιείται συχνά, καθώς δεν διευκολύνει τη βελτιστοποίηση. πχ b*b-4*a*c Προθεματικός κώδικας -*bb**4ac Επιθεματικός κώδικας bb*4a*c*-

Κώδικας Τριών Διευθύνσεων Ένας τελεστής σε κάθε εντολή. Τρεις διευθύνσεις οι οποίες αντιπροσωπεύουν τα ορίσματα και το αποτέλεσμα του τελεστή. Παράδειγμα: Έκφραση Κώδικας τριών διευθύνσεων: w=x+y*z $1 = y * z w= x + $1 Περιέχει δύο "κλάσεις" αντικειμένων: διευθύνσεις και εντολές addresses and instructions Ο κώδικας "γράφεται" είτε με την μορφή τριάδων είτε με την μορφή τετράδων.

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

Γλώσσα των Τετράδων Κάθε εντολή αποτελείται από μια αριθμητική ετικέτα, το τελεστή 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

Απλές και Σύνθετες Διευθύνσεις Απλές διευθύνσεις είναι: Σταθερά Όνομα μεταβλητής, παραμέτρου ή υποπρογράμματος (δείκτης στην αντίστοιχη εγγραφή στον πίνακα συμβόλων) Προσωρινή μεταβλητή με τη μορφή $n, όπου n ακέραιος (αποθήκευση ενδιάμεσων αποτελεσμάτων). Αποτέλεσμα συνάρτησης, με τη μορφή $$. Σύνθετες Διευθύνσεις Διεύθυνση: αν x είναι τύπου τ, τότε {x} αντικείμενο που "δείχνει" στο τ και είναι τύπου ^τ. Αποδεικτοδότηση: αν x τύπου ^τ τότε [x] είναι τύπου τ.

Άλλες Παράμετροι Ετικέτα Τετράδας, που χρησιμοποιείται για την πραγματοποίηση άλματος Ετικέτα εντολής, για πραγματοποίηση αλμάτων με εντολή 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: *,y,z,$1 110: +,x,$1,$2 120: +,$2,w,$3 130: +,$3,3,$4 140: :=,$4,-,v v = -r + 18 100: -,r,-,$1 110: +,$1,18,$2 120: :=,$2,-,v

Εντολές Άλματος jump,-,-,z Η εντολή πραγματοποιεί άλμα στην τετράδα με ετικέτα z (αριθμητική ετικέτα) label,l,-,- Ορίζει μια ετικέτα εντολής με το όνομα l. jumpl,-,-,l Η εντολή πραγματοποιεί άλμα στην τετράδα με ετικέτα εντολής l (που πρέπει να ορίζεται όπως παραπάνω)

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

Παράδειγμα Εντολών Άλματος if x < 3 then y=18 else y = 5;...; 100: <,x,3,120 110: jump,-,-,140 120: :=,18,-,y 130: jump,-,-,150 140: :=,5,-,y 150:... v = true; if v then x = 1;... 100: :=,true,-,v 110: ifb,v,-,130 120: jump,-,-,140 130: :=,1,-,x 140:...

Παράδειγμα Εντολών Άλματος if x < 3 then y=18; x=y; else y = 5;...; 100: <,x,3,120 110: jumpl,-,-,lfalse 120: :=,18,-,y 130: :=,y,-,x 140: jumpl,-,-,ifend 150: label,-,-,lfalse 160: =,5,-,y 170: label,-,-,ifend

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

Παράδειγμα int f(x) { if x = 0 return 0; z = 100 mod x; return 2*z; }... z=8; y=12*f(z) 100: unit,-,-,f 110: =,0,x,120 110: jump,-,-,140 120: :=,0,-,$$ 130: ret,-,-,- 140: %,100,x,$1 150: *,2,$1,$$ 160: endu,-,-,f... 500: :=,8,-,z 510: par,z,v,- 520: par,$10,ret,- 530: call,f,-,- 540: *,12,$10,y

Γλώσσες Προγραμματισμού Μεταγλωττιστές Μετάφραση Οδηγούμενη από την Σύνταξη για την Παραγωγή Ενδιάμεσου Κώδικα

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

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

Σχόλια Για την συγκεκριμένη υλοποίηση υπάρχουν οι ακόλουθες ιδιότητες: place: περιέχει τη θέση του αντικειμένου στην οποία βρίσκεται μια τιμή. Είναι δηλαδή η διεύθυνση της μεταβλητής. type: ο τύπος στον οποίο ανήκει μια τιμή. Οι συναρτήσεις που χρησιμοποιούνται είναι οι ακόλουθες: genquad: παράγει μια νέα τετράδα εντολής με τα τέσσερα ορίσματα. newtemp: Δημιουργεί μια νέα μεταβλητή συγκεκριμένου τύπου.

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

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

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

Μετάφραση Λογικών Εκφράσεων (iii) falselist = {12,30} :=42... 07: jump,-,-,51... 12: jump,-,-,42... 20: jump,-,-,51... 26: jump,-,-,51... 30: jump,-,-,42... 33: jump,-,-,51... truelist = {7,20,26,33} := 51 42:... 51:...

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

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

Παράδειγμα Γραμματικής Λογική Σύζευξη B::=B 1 "and" { backpatch(b 1.truelist;nextQuad);} B 2 {B.truelist := B 2.truelist; B.falselist := merge(b 1.falselist,B 2.falselist } falselist Β 1 truelist falselist Β 2 truelist falselist truelist

Παράδειγμα Γραμματικής Λογική Άρνηση B::="not" B 1 { B.truelist := B 1.falselist; B.falselist := B 1.truelist; } truelist Β 1 falselist falselist truelist

Λογικές Σχέσεις Λογικές σχέσεις αφορούν τη μετάφραση τελεστών ">","<","=","=<","=>" κλπ. B ::= "Ε 1 " relop "Ε 2 " {B.truelist := makelist(nextquad); genquad(relop.name,ε 1.place,Ε 2.place,*) B.falselist := makelist(nextquad); genquad(jump,-,-,*);} E 1 falselist E 2 Relop,E1,E2,* jump,-,-,* truelist

Σχόλια Η nextquad επιστρέφει τον αριθμό ετικέτας της επόμενης τετράδας που θα παραχθεί. Υποθέτουμε ότι η genquad αυξάνει τον αριθμό αυτό κατάλληλα. Η name είναι κατάλληλη συνθετική μεταβλητή για το σύμβολο relop, όπου αποθηκεύεται το όνομα του συμβόλου. πχ. relop ::= ">" {relop.name = ">"}

Παράδειγμα Έστω η λογική έκφραση (i>=30) and (i < 40) or (i=10) Η μετάφραση της θα είναι: 10: >,i,30,* 20: jump,-,-,* 10: >,i,30,30 20: jump,-,-,* 30: <,i,40,* (backpatching) 10: >,i,30,30 20: jump,-,-,50 30: <,i,40,100 40: jump,-,-,50 50: =,i,10,100 60: jump,-,-,140... 100:... (true) 140:... (false)

Μετάφραση των True/False και Παρενθέσεων Kανόνας Μετάφρασης για την σταθερά true B::="true" {B.truelist := makelist(nextquad); B:falselist := emptylist(); genquad(jump,-,-,*)} Kανόνας Μετάφρασης για την σταθερά false B::="false" {B.falselist := makelist(nextquad); B.truelist := emptylist(); genquad(jump,-,-,*)} Β::="(" Β 1 ")" {B.falselist = B 1.falselist B.truelist = B 1.truelist}

Μετάφραση τελεστών σε Δομές Διακλάδωσης H εντολή διακλάδωσης if-then S::= "if" B "then" {backpatch(b.truelist,nextquad)} S 1 {S.nextlist = mergelists(b.falselist,s 1.nextlist) } truelist Β falselist S 1 nextlist nextlist

Σχόλια H mergelists ενώνει τις δύο λίστες ετικετών τετράδων. Η S.nextlist θα χρησιμοποιηθεί σε εντολή backpatching όταν γίνει γνωστή η επόμενη τετράδα και θα πάρουν τιμές οι αντίστοιχες εντολές jump.

Παράδειγμα Έστω if (i>=30) and (i < 40) or (i=10) then i:=i+1 10: >,i,30,30 20: jump,-,-,50 30: <,i,40,* (truelist) 40: jump,-,-,50 50: =,i,10,* (truelist) 60: jump,-,-,* (falselist) 10: >,i,30,30 20: jump,-,-,50 30: <,i,40,70 (truelist) 40: jump,-,-,50 50: =,i,10,70 (truelist) 60: jump,-,-,* (falselist) 70: +,i,1,$1 80: =,i,-,$1 90:

Εντολή Διακλάδωσης if-then-else S::= "if" B "then" {backpatch(b.truelist,nextquad)} S 1 {L 1 =nextquad; genquad(jump,-,-,*)} "else" {backpatch(b.falselist,nextquad);} S 2 {S.nextlist=mergelists(L 1,S 1.nextlist,S 2.nextlist);} falselist Β truelist jump,-,-,* S 1 S 2 nextlist nextlist nextlist nextlist

Εντολή if B then S1 else S2 B.code to B.truelist to B.falselist B.truelist: B.falselist: S1.code jump,-,-, S2.code S.next:

Εντολή while-do Η εντολή while έχει την μορφή: S::= "while" {L=nextQuad;} B "do" {backpatch(b.truelist,nextquad);} S 1 {backpatch(s 1.nextlist,L); genquad(jump,-,-,l); S.nextlist=B.falselist;} falselist truelist Β S 1 nextlist nextlist jump,-,-,*

Παράδειγμα while i<n do p := p + 1; 100: <,i,n,* 110: jump,-,-,* 120: +,p,1,$1 130: =,p,-,$1 140: jump,-,-,* 150: 100: <,i,n,120 110: jump,-,-,* 120: +,p,1,$1 130: =,p,-,$1 140: jump,-,-,100 150:

Κλήση Συναρτήσεων (Απλή) Κλήση συναρτήσεων χωρίς να ληφθεί υπόψη μετατροπή τύπων και τύποι παραμέτρων. Call::= "id" "(" P ")" {Call.place = newtemp(id.type); genquad("par",ret,call.place,-); genquad(call,-,-,id.place)} P::=ε P::=E {genquad("par",e.place,-,-);} D D::=ε D::="," E {genquad("par".e.place,-,-)} D

Εντολές goto break Η μετάφραση των εντολών αυτών γίνεται με τις μεθόδους που έχουν ήδη αναφερθεί. Για την εντολή goto μπορεί να διατηρηθεί μια λίστα και έπειτα να γίνει backpatching όταν οι ετικέτες των labels γίνουν γνωστές. Η εντολή break σε ένα while-do μπορεί να υλοποιηθεί με δημιουργία αντίστοιχου άλματος και τοποθέτηση του στη λίστα nextlist της εντολής. Αργότερα παίρνει τιμή με backpatching.

Σύνοψη Παραγωγή ενδιάμεσου κώδικα. Ενδιάμεσες γλώσσες. Αφηρημένα συντακτικά δένδρα Προθεματικός και επιθεματικός κώδικας Κώδικας τριών διευθύνσεων Γλώσσα τριάδων και τετράδων. Σχήματα οδηγούμενα από τη σύνταξη. Λογικές Εκφράσεις Backpatching Εντολές διακλάδωσης υπο συνθήκη Εντολή while-do