Σηµειώσεις Μεταγλωττιστές



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

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

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

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

Γενικές Παρατηρήσεις. Μη Κανονικές Γλώσσες - Χωρίς Συµφραζόµενα (1) Το Λήµµα της Αντλησης. Χρήση του Λήµµατος Αντλησης.

Έστω συμβολοσειρά Το σύνολο FIRST περιέχει τα τερματικά σύμβολα από τα οποία αρχίζουν οι συμβολοσειρές που παράγονται από την

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

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

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 4 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

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

3 Αναδροµή και Επαγωγή

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

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

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

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

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

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

Κεφάλαιο 2: Τυπικές γλώσσες

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

Στοιχεία Θεωρίας Υπολογισµού (1): Τυπικές Γλώσσες, Γραµµατικές

Ποιές οι θεµελιώδεις δυνατότητες και ποιοί οι εγγενείς περιορισµοί των υπολογιστών ; Τί µπορούµε και τί δε µπορούµε να υπολογίσουµε (και γιατί);

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

Μεταγλωττιστές. Ενότητα 2: Τυπικές γλώσσες (Μέρος 1 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Λεκτικός Αναλυτής. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Κεφάλαιο 5ο: Εντολές Επανάληψης

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

Σύνοψη Προηγούµενου. Γλώσσες χωρίς Συµφραζόµενα (2) Ισοδυναµία CFG και PDA. Σε αυτό το µάθηµα. Αυτόµατα Στοίβας Pushdown Automata

Mεταγλωττιστές. 4 ο εργαστηριακό μάθημα Λεξική ανάλυση και flex. Θεωρία

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 3 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

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

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

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

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

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

KΕΦΑΛΑΙΟ 4 AΚΟΛΟΥΘΙΕΣ ΠΡΑΓΜΑΤΙΚΩΝ ΑΡΙΘΜΩΝ

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

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

Top Down Bottom Up. Συντακτική Ανάλυση. Συντακτική Ανάλυση για Γραµµατικές χωρίς Συµφραζόµενα (top-down - Earley)

Μεταγλωττιστές. μια φοιτητική προσέγγιση

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

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

Θεωρία Υπολογισμού και Πολυπλοκότητα Ασυμφραστικές Γλώσσες (1)

Μεταγλωττιστές. Ενότητα 7: Συντακτική ανάλυση (Μέρος 1 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΚΕΦΑΛΑΙΟ 4 ΒΑΣΙΚΕΣ ΤΕΧΝΙΚΕΣ ΣΥΝΤΑΚΤΙΚΗΣ ΑΝΑΛΥΣΗΣ

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Στοιχεία Θεωρίας Υπολογισµού (2): Πεπερασµένα Αυτόµατα, Κανονικές Εκφράσεις

Κεφάλαιο 3β. Ελεύθερα Πρότυπα (µέρος β)

Γραµµατικές για Κανονικές Γλώσσες

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

1 Συνοπτική ϑεωρία. 1.1 Νόµοι του Προτασιακού Λογισµού. p p p. p p. ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ Τµήµα Επιστήµης Υπολογιστών

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

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

Αυτόματα. Παράδειγμα: πωλητής καφέ (iii) Παράδειγμα: πωλητής καφέ (iv) Εισαγωγή στην Επιστήμη των Υπολογιστών 6

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

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

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

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

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

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

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

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

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

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟ MATLAB- SIMULINK

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ. Διδάσκουσα Δρ Β.

Επαναληπτικές δοµές. µτ α.τ. Όχι. ! απαγορεύεται µέσα σε µία ΓΙΑ να µεταβάλλουµε τον µετρητή! διότι δεν θα ξέρουµε µετά πόσες επαναλήψεις θα γίνουν

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

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

KΕΦΑΛΑΙΟ 1 ΧΡΗΣΙΜΕΣ ΜΑΘΗΜΑΤΙΚΕΣ ΕΝΝΟΙΕΣ. { 1,2,3,..., n,...

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

Το εσωτερικό ενός Σ Β

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

Κατηγορικές Γραµµατικές

επιµέλεια Θοδωρής Πιερράτος

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

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

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

ΕΠΛ 211: Θεωρία Υπολογισμού και Πολυπλοκότητας. Διάλεξη 7: Ασυμφραστικές Γλώσσες (Γλώσσες Ελεύθερες Συμφραζομένων)

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

KΕΦΑΛΑΙΟ 6 ΥΝΑΜΟΣΕΙΡΕΣ-ΣΕΙΡΕΣ TAYLOR

4.3. Γραµµικοί ταξινοµητές

ΓΡΑΜΜΙΚΑ ΣΥΣΤΗΜΑΤΑ ΕΞΙΣΩΣΕΩΝ

Εισαγωγή. Γενική Εικόνα του Μαθήµατος. Το εσωτερικό ενός Σ Β. Εισαγωγή. Εισαγωγή Σ Β Σ Β. Αρχεία ευρετηρίου Κατάλογος συστήµατος Αρχεία δεδοµένων

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

Γλώσσες που περιγράφονται από Κανονικές Εκφράσεις

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

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

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

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

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Απλοποιεί τα γεγονότα έτσι ώστε να περιγράφει τι έχει γίνει και όχι πως έχει γίνει.

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

Τεχνητή Νοημοσύνη. 21η διάλεξη ( ) Ίων Ανδρουτσόπουλος.

Δοµές Δεδοµένων και Αλγόριθµοι - Εισαγωγή

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

Transcript:

Σηµειώσεις Μεταγλωττιστές 1. Eισαγωγή Στο κεφάλαιο αυτό θα περιγράψουµε τα στοιχεία ενός µεταγλωττιστή, το περιβάλλον εργασίας καθώς και ορισµένα εργαλεία λογισµικού για την κατασκευή µεταγλωττιστών. Στα επόµενα κεφάλαια θα εξετάσουµε καθένα από αυτά τα στοιχεία πιο λεπτοµερειακά. 1.1 Γενικά Απλά ένας µεταγλωττιστής είναι ένα πρόγραµµα το οποίο διαβάζει ένα πρόγραµµαγραµµένο σε µια γλώσσα (Source γλώσσα) και το µεταφράζει σε ένα ισοδύναµο πρόγραµµα σε µια άλλη γλώσσα (target γλώσσα). source Πηγαίος κώδικας µεταγλωττιστής target Στόχος Μηνύµατα Λαθών Σχήµα 1.1 H κατασκευή ενός µεταγλωττιστή είναι µια πολύπλοκη διαδικασία. Eιδικά για τους πρώτους µεταγλωττιστές (δεκαετία του 50) απαιτήθηκε τεράστιος αριθµός ανθρωποµηνών. Aναφέρεται ότι ο πρώτος FORTRAN µεταγλωττιστής χρειάστηκε 18 ανθρωποέτη. Aπο τότε αφενός µεν έχουν συστηµατικοποιηθεί οι τεχνικές για τον σχεδιασµό των διαφόρων διαδικασιών που εκτελούνται από ένα µεταγλωττιστή και αφετέρου έχουν αναπτυχθεί πολλά εργαλεία λογισµικού. Eδω θα θέλαµε να αναφερθούµε στους interpreters (διερµηνείς), επειδή καµία φορά υπάρχει σύγχυση µεταξύ interpreter και µεταγλωττιστή. Eνας interpreter αντί να παράγει ένα πρόγραµµα που θα είναι η µετάφραση όλου του προγράµµατος εισόδου αναλύει, µεταφράζει και εκτελεί άµεσα τις εντολές του προγράµµατος εισόδου µία-µία. Οι interpreters χρησιµοποιούνται συχνά σε command γλώσσες αφού κάθε τελεστής µιας τέτοιας γλώσσας συνήθως ενεργοποιεί µια πολύπλοκη ρουτίνα. (π.χ. editor, µεταγλωττιστή). Πολλές φορές όµως υπάρχουν και ανώτερες γλώσσες προγραµµατισµού οι οποίες λειτουργούν µε interpreter (π.χ. APL). 1.2 Στάδια µετάφρασης Τα στάδια της µετάφρασηςενόςπρογράµµατος θα µπορούσαν να χωριστούν σε δύο στην ανάλυση και στη σύνθεση. Kατα την ανάλυση το πρόγραµµα εισόδου διαβάζεται, αναγνωρίζονται τα συστατικά µέρη του και δηµιουργείται ένας ενδιάµεσος κώδικας, που είναι απεικόνιση του προγράµµατος εισόδου. Hσύνθεση δηµιουργεί από τον ενδιάµεσο κώδικα πρόγραµµα ένα πρόγραµµα ισοδύναµο µε αυτό της εισόδου, γραµµένο στην επιθυµητή γλώσσα (π.χ. assembler, γλώσσα µηχανής). Αυτός όµως ο διαχωρισµός είναι πολύ γενικός. Eνας µεταγλωττιστής µεταφράζει σε διαδοχικές φάσεις. Tο στάδιο της ανάλυσης περιλαµβάνει 3 φάσεις: την Λεκτική Aναλυση, την Συντακτική Aναλυση και την Σηµασιολογική Aναλυση. Tο στάδιο της σύνθεσης περιλαµβάνει επίσης 3 φάσεις: Tην ηµιουργία Ενδιάµεσου Kωδικα, Βελτιστοποίηση Eνδιάµεσου Kωδικα και Παραγωγή Tελικου Kωδικα. Kάθε φάση µετατρέπει το αρχικό πρόγραµµα από µια παράσταση σε µια άλλη ισοδύναµη. Tο σχήµα 1.2 απεικονίζει τις φάσεις της µετάφρασης. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 1

Πηγαίο Πρόγραµµα Λεκτικός Αναλυτής Συντακτικός Αναλυτής ιαχείριση Πίνακα Συµβόλων Σηµασιολογικός Αναλυτής Παραγωγή Ενδιάµεσου Κώδικα ιαχείριση Λαθών Βελτιστοποίηση Ενδιάµεσου Κώδικα Παραγωγή Τελικού Κώδικα Τελικό Πρόγραµµα Σχήµα 1.2 Στο σχήµα 1.2 απεικονίζονται δυο επιπλέον διαδικασίες η ιαχείριση Πίνακα Συµβόλων και η ιαχείριση Λαθών που επικοινωνούν µε τις έξι φάσεις που προαναφέραµε. Θα ονοµάζουµε και αυτές φάσεις. ιαχείριση Πίνακα Συµβόλων Μια σηµαντική λειτουργία ενός µεταγλωττιστή είναι να καταγράφει τις µεταβλητές που χρησιµοποιούνται σε ένα πηγαίο πρόγραµµα και να συλλέγει πληροφορίες για τα χαρακτηριστικά των µεταβλητών αυτών (τύπος, πεδίο ισχύος, σε περίπτωση procedure ή function αριθµό παραµέτρων, κλπ). Οι πληροφορίες αποθηκεύονται σε µια δοµή στον πίνακα συµβόλων που επιτρέπει την γρήγορη αναζήτηση κάποιας µεταβλητής καθώς και την αποθήκευση και ανάκτηση πληροφοριών για την µεταβλητή. Όταν µια µεταβλητή αναγνωρίζεται από τον λεκτικό αναλυτή τοποθετείται στον πίνακα συµβόλων. Tα χαρακτηριστικά τους δεν µπορούν να αναγνωριστούν από τον λεκτικό αναλυτή. Π.χ. σε µια δήλωση µεταβλητών στη Pascal: var p, i, r : real; ο τύπος των Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 2

µεταβλητών δεν αναγνωρίζεται όταν τα ονόµατα τους διαβάζονται για πρώτη φορά από τον λεκτικό αναλυτή. Οι υπόλοιπες φάσεις συµπληρώνουν τα δεδοµένα του πίνακα. Αναγνώριση Λαθών και µηνύµατα Κάθε φάση µπορεί να συναντήσει λάθη. Όταν ένα λάθος αναγνωριστεί σε µια φάση πρέπει κάπως να αντιµετωπιστεί (ανάκαµψη - error recovery) ώστε να συνεχιστεί η µετάφραση του προγράµµατος. εν πρέπει να σταµατάει στο πρώτο λάθος. Hσυντακτική και σηµασιολογική ανάλυση αντιµετωπίζουν το µεγαλύτερο µέρος των λαθών. Λεκτική Ανάλυση Στην πρώτη φάση γίνεται η αναγνώριση των tokens του προγράµµατος. Token είναι κάθε µια στοιχειώδης νοηµατική µονάδα (ένα σύµβολο) που χρησιµοποιεί µια γλώσσα προγραµµατισµού π.χ δεσµευµένες λέξεις (while, if) ονόµατα µεταβλητών, τελεστές (<, <=, :=) κλπ. Oλεκτικός αναλυτής διαβάζει τους χαρακτήρες του πηγαίου προγράµµατος και από τα strings αναγνωρίζει λεκτικά (lexemes) που ανταποκρίνονται σε tokens (σύµβολα) της γλώσσας. Έτσι αναγνωρίζει σύµβολα όπως ".", ",", ":=', "begin". Σε µερικά σύµβολα θα προσθέσει και κάποια "λεκτική τιµή". Π.χ. όταν αναγνωρίσει µια µεταβλητή p θα επιστρέψει το σύµβολο (token) id1 αλλά θα τοποθετήσει στον πίνακα συµβόλων το λεκτικό p αν δεν είναι ήδη στον πίνακα. Hαπεικόνιση της εντολής: p:=i+r*60 που παράγει ο λεκτικός αναλυτής θα είναι η σειρά των επτά συµβόλων (tokens): id 1 := id 2 + id 3 * 60 H λεκτική ανάλυση λέγεται και γραµµική ανάλυση καθώς και σάρωση. Oλεκτικός αναλυτής αναγνωρίζει τα p, i, r σαν identifiers αναγνωρίζει τους τελεστές ":=", "+" και "*" καθώς και τον αριθµό 60. H έξοδος είναι επίσης γραµµική. Oπίνακας συµβόλων έχει διαµορφωθεί ως εξής: Πίνακας Συµβόλων Symbol Table Όνοµα Τύπος p r i Σχήµα 1.3 H λεκτική ανάλυση βρίσκει λάθη όταν οι χαρακτήρες που διαβάζει δεν σχηµατίζουν tokens της γλώσσας. Συντακτική ανάλυση Aκολουθεί η συντακτική ανάλυση (syntax analysis, λέγεται και parsing). Στη φάση αυτή από τη γραµµική έξοδο του λεκτικού αναλυτή δηµιουργούνται γραµµατικές φράσεις σύµφωνα µε τους κανόνες της γλώσσας. Συνήθως οι γραµµατικές αυτές φράσεις παριστάνoνται µε ένα δένδρο το οποίο λέγεται συντακτικό δένδρο (syntax tree ή parse tree). Στο παράδειγµα µας η έξοδος από τον συντακτικό αναλυτή θα δηµιουργήσει το κατωτέρω parse δένδρο: Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 3

:= id1 + id2 * id3 60 Σχήµα 1.4 Υπάρχουν και άλλου τύπου δένδρα που απεικονίζουν και τις γραµµατικές φράσεις (θα εξεταστούν αργότερα). H συντακτική ανάλυση βρίσκει λάθη όπου τα tokens δεν σχηµατίζουν επιτρεπόµενες δοµές σύνταξης της γλώσσας. Σηµασιολογική Ανάλυση Κατά τη σηµασιολογική ανάλυση το πρόγραµµα ελέγχεται για σηµασιολογικά λάθη. H σηµασιολογική ανάλυση χρησιµοποιεί την ιεραρχική δοµή της συντακτικής ανάλυσης για να αναγνωρίσει τους τελεστές και τις µεταβλητές στις εκφράσεις και στις εντολές. Kατα την σηµασιολογική ανάλυση γίνεται και ο έλεγχος των τύπων των µεταβλητών και δεδοµένων (type checking). O µεταγλωττιστής ελέγχει ότι οι µεταβλητές ενός τελεστή είναι τύπου που επιτρέπεται από την γλώσσα (π.χ. µπορεί µια γλώσσα να µην επιτρέπει πρόσθεση real και character µεταβλητής). Eπίσης, η σηµασιολογική ανάλυση φροντίζει για τις απαραίτητες µετατροπές όταν αυτές επιτρέπονται από τη γλώσσα (π.χ. πρόσθεση real και integer). Στο παράδειγµα µας ο σηµασιολογικός αναλυτής θα µας δώσει το κατωτέρω δένδρο: := id1 + id2 * id3 intoreal Σχήµα 1.5 60 Aν υποθέσουµε ότι όλες οι µεταβλητές (p,i,r) είναι real τότε έχουµε τον τελεστή * να εφαρµόζεται σε ένα πραγµατικό και ένα ακέραιο. Στην περίπτωση αυτή ο ακέραιος πρέπει να µετατραπεί σε real και αυτό επιτυγχάνεται µε τον τελεστή intoreal. Mετα την συντακτική και σηµασιολογική ανάλυση ο πίνακας συµβόλων διαµορφώνεται Πίνακας Συµβόλων Symbol Table Όνοµα Τύπος p real r real i real Σχήµα 1.6 Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 4

H σηµασιολογική ανάλυση βρίσκει λάθη σε συντακτικά σωστές δοµές που όµως δεν είναι σηµασιολογικά σωστές (π.χ. πρόσθεση ακέραιας και λογικής µεταβλητής). Παραγωγή Ενδιάµεσου Κώδικα Aπό µια σηµασιολογικά σωστή έκφραση θα δηµιουργηθεί ένας ενδιάµεσος κώδικας, που µπορεί να έχει πολλές µορφές. Hενδιάµεση αυτή απεικόνιση µπορεί να θεωρηθεί σαν ένα πρόγραµµα για µια αφηρηµένη µηχανή. Πρέπει να έχει δύο χαρακτηριστικά: να παράγεται εύκολα και να µετατρέπεται εύκολα στη τελική γλώσσα. Mπορεί να είναι της µορφής "τριών διευθύνσεων κώδικα", όπου όλες οι εντολές τρεις operands, το πολύ µια πράξη και µια απόδοση τιµής. π.χ. στο παράδειγµα µας t 1 := intoreal(60) t 2 := id 3 *t 1 t 3 := id 2 +t 3 id 1 := t 3 Bελτιστοποίηση Eνδιάµεσου Kώδικα H φάση της βελτιστοποίησης έχει στόχο τη δηµιουργία κώδικα που θα έχει σαν αποτέλεσµα κώδικα γλώσσας µηχανής που θα τρέχει γρηγορότερα. Eτσι µπορεί να γίνει κατευθείαν η µετατροπή του 60 σε πραγµατικό και να ενοποιηθούν εντολές: t 1 := id 3 * 60.0 id 1 := id 2 +t 1 Παραγωγή Tελικού Kώδικα H τελευταία φάση του µεταγλωττιστή δηµιουργεί κώδικα σε γλώσσα µηχανής η σε Assembly. LDA id 3,R0 MUL 60.0, R0 ADD id 2,R0 STO id 1,R0 Συχνάοιφάσειςχωρίζονταισεfront end και σε back end. Oι πρώτεςέχουνσχέσηµε οτιδήποτε εξαρτάται από τη source γλώσσα και οι δεύτερες κυρίως από την µηχανή. Στην front end περιλαµβάνονται η λεκτική ανάλυση, η συντακτική ανάλυση, η δηµιουργία του symbol table, η σηµασιολογική ανάλυση και ο ενδιάµεσος κώδικάς. H back end περιλαµβάνει τη βελτιστοποίηση του κώδικα και τη δηµιουργία κώδικα µηχανής. ιάφορες φάσεις µιας µετάφρασης γίνονται σε ένα πέρασµα (διάβασµα της εισόδου). Π.χ. η λεκτική ανάλυση, η συντακτική ανάλυση, η σηµασιολογική ανάλυση και ο ενδιάµεσος κώδικας γίνονται στο ίδιο πέρασµα. Στην περίπτωση αυτή η ροή των tokens από τη λεκτική ανάλυση µεταφράζεται άµεσα σε ενδιάµεσο κώδικα. Tότε, ο συντακτικός αναλυτής έχει ενεργοποιηθεί και προσπαθεί να ανακαλύψει την γραµµατική δοµή των tokens που βλέπει. Λαµβάνει tokens όταν τα θέλει καλώντας τον λεκτικό αναλυτή να του δώσει το επόµενο token. Oταν βρει την γραµµατική δοµή καλεί τη ρουτίνα που δηµιουργεί τον ενδιάµεσο κώδικα. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 5

2.Λεκτική Aνάλυση 2.1 Eισαγωγή O σκοπόςτηςλεκτικήςανάλυσηςείναιηαναγνώρισητωνtokens. Eναςαπλόςτρόποςνα γράψει κανείς ένα λεκτικό αναλυτή είναι να φτιάξει ένα διάγραµµα µε τα tokens της γλώσσας και στη συνέχεια να µεταφράσειαυτότοδιάγραµµα σεπρόγραµµα που να βρίσκει τα tokens. Oι τεχνικές που θα αναφέρουµε για την ανάπτυξη λεκτικών αναλυτών µπορούν να εφαρµοσθούν και σε άλλες περιοχές όπως text formatters σε γλώσσες ερωτήσεων πληροφοριακών συστηµάτων (query languages) κλπ. Tο σχήµα 2.1 δίνει διαγραµµατικά την λειτουργικότητα ενός λεκτικού αναλυτή. Eίναι µια ρουτίνα που συνεργάζεται µε τον συντακτικό αναλυτή δίνοντας του tokens. Source Πρόγραµµα Λεκτικός Αναλυτής σύµβολο Φέρε επόµενο σύµβολο Συντακτικός Αναλυτής Πίνακας Συµβόλων Σχήµα 2.1 O λεκτικός αναλυτής παράλληλα εκτελεί και κάποιες δευτερεύουσες εργασίες. Mια από αυτές είναι να παρακάµψει τα σχόλια και τα κενά καθώς και σύµβολα όπως το newline. Mια άλληείναινασυσχετίσειταλάθηµε τοσηµείο του κώδικα που έχουν βρεθεί. Oρολογία Θα χρησιµοποιήσουµε τουςόρουςtoken, λεκτικό(lexeme) και πρότυπο(pattern). O πίνακας 2.2 δίνει µερικά παραδείγµατα. Σύµβολα- tokens Λεκτικά-lexemes Πρότυπα-patterns const const Οι χαρακτήρες const if If, IF, if, if Οι συνδυασµοί χαρακτήρων If,IF,if,iF Relation <,<=,=,>,>=,<> Οι συνδυασµοί χαρακτήρων <,<=, =, >, >=,<> id P, r, I, s5 γράµµα ακολουθούµενο από γράµµαηψηφίο num 3.14, 28, -.1E-3 Αριθµητική σταθερά Πίνακας 2.2 Τα tokens είναι τερµατικά σύµβολα της γραµµατικής. Tα λεκτικά είναι strings που ικανοποιώντας ένα πρότυπο προσδιορίζουν ένα token. Όταν περισσότερα από ένα λεκτικά ικανοποιούν ένα πρότυπο τότε ο λεκτικός αναλυτής πρέπει να δώσει κάποιες επιπλέον πληροφορίες στις επόµενες φάσεις. Oι πληροφορίες αυτές δίδονται µετιςτιµές κάποιων attributes (χαρακτηριστικών) που προσδιορίζουν το αντίστοιχο token. παραδείγµατος χάριν όταν στην PASCAL γράψουµε p:=i*r+2 τα tokens από το λεκτικό αναλυτή θα δοθούν ως εξής Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 6

< id, pointer στο symbol table στηθέσητουp> < τελεστής αντικατάστασης> <id, pointer στο symbol table στηθέσητουi> <τελεστής πολλαπλασιασµού> <id, pointer στο symbol table στηθέσητουr> <τελεστής πρόσθεσης> <num, αριθµητική τιµή 2> Σε µερικά tokens δεν χρειάζεται attribute. Tο num θα µπορούσε να έχει ένα pointer στο symbol table για την τιµή 2. O λεκτικός αναλυτής, λόγω του τρόπου που βλέπει το πρόγραµµα, βρίσκει πολύ λίγα λάθη. Tα λάθη του περιορίζονται όταν ένα πρότυπο δεν συµπίπτει µε κανένα από τα πρότυπα ενός token. Στην περίπτωση αυτή προσπερνάει χαρακτήρες µέχρι να βρει ένα καλά ορισµένο token. 2.2 Προσδιορισµός των tokens Για τον προσδιορισµό των token θα χρησιµοποιήσουµε τις κανονικές εκφράσεις. Eπειδή κάθε πρότυπο ταιριάζει σε ένα σύνολο από strings οι κανονικές εκφράσεις θα χρησιµοποιηθούν σαν ονόµατα για σύνολα από strings. Aλφάβητο (κλάση χαρακτήρων) είναι ένα πεπερασµένο σύνολο από σύµβολα. Π.χ. το σύνολο {0,1} είναι το δυαδικό αλφάβητο. Tο ASCII και το EBCDIC είναι παραδείγµατα αλφάβητων. Eνα string, πάνω σε ένα αλφάβητο, ορίζεται σαν µια πεπερασµένη ακολουθία από σύµβολα απόαυτότοαλφάβητο.mήκος του string (του s το συµβολίζουµε µε s ) ορίζουµε το πλήθος των συµβόλων του string. Π.χ. το string 'πατάτα' έχει µήκος 6. Tο κενό string, το συµβολίζουµε µε ε, είναι ένα ειδικό string µήκους 0. O παρακάτω πίνακας έχει κάποιους όρους που χρησιµοποιούνται στα strings. πρόθεµα(prefix) του s: είναι ένα string προκύπτει από το s όταν πάρουµε 0 η περισσότερα σύµβολα από την κεφαλή του s(π.χ. πατά είναι πρόθεµα του πατάτα) επίθεµα(suffix) του s: είναι το string που προκύπτει από το s όταν κόψουµε 0 η περισσότερα σύµβολα από την αρχή του s(π.χ τάτα είναι suffix του πατάτα) substring του s: είναι ένα string που προκύπτει από το s αν διαγράψουµε ένα πρόθεµα και ένα επίθεµα (το άτα είναι substring του s) κανονικό πρόθεµα, επίθεµα η substring του s: κάθε µη κενό string που είναι πρόθεµα αντίστοιχα επίθεµαηsubstring του s Aν ταx και y είναι strings τότε ο τελεστής concatenation των x και y, συµβολίζεται xy, oρίζεται το string που προκύπτει όταν το y προστεθεί στο τέλος του x. Π.χ. αν x= επί και y= βλεψη τότε xy= επίβλεψη. Αν θεωρήσουµε την concatenation σαν γινόµενο τότε µπορούµε να ορίσουµε ύψωση σε δύναµησαν: s 0 = ε i>0 s i =s i-1 s και επειδή εs=s είναι s 1 =s. Πράξεις σε γλώσσες Yπάρχουν ορισµένες πράξεις που γίνονται σε γλώσσες και που είναι χρήσιµες στη λεκτική ανάλυση. Παρακάτω ορίζονται ορισµένες πράξεις σε γλώσσες. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 7

Eνωση(union) των γλωσσών L και M(L M) : {s s L η s Μ Συνένωση(Concatenation) των L και M (LM): {st s L και t Μ Eγκλισµος (closure) της L(L * ): L * =L i το L * είναι 0 η περισσότερες συνενώσεις του L i=0 Θετικός εγκλεισµός(positive closure) της L, το L + µια η περισσότερες συνενώσεις του L (L + ): L + = L i i=1 Παράδειγµα: Έστω L={A,B,..,Z,a,b,...,z} και D={0,1,..,9}. Tα L και D µπορούµε να τα δούµε σαν αλφάβητα, το L τα κεφαλαία και τα µικρά λατινικά γράµµατα και το D τα ψηφία, αλλά και σαν γλώσσες µε strings µήκους 1. Mε τις παραπάνω πράξεις µπορούµε να ορίσουµε τιςπιοκάτωγλώσσεςαπότιςl και D. 1)L D το σύνολο των γραµµάτων και των ψηφίων 2)LD το σύνολο των strings που αποτελούνται από γράµµα ακολουθούµενο από ψηφίο. 3)L(L D) * είναιτοσύνολοτωνstrings που αποτελούνται από γράµµατα και ψηφία και αρχίζουν µε γράµµα. Kανονικές εκφράσεις Για την περιγραφή των tokens θα χρησιµοποιήσουµε ένασυµβολισµό που είναι γνωστός σαν κανονικές εκφράσεις (regural expressions). Mια κανονική έκφραση κατασκευάζεται από άλλες απλούστερες κανονικές εκφράσεις σύµφωνα µε ένα σύνολο από κανόνες. Kάθε κανονική έκφραση r ορίζει µια γλώσσα L(r). Oι κανόνες προσδιορίζουν πως σχηµατίζονται τα στοιχεία της L(r). Eστω ένα αλφάβητο Σ. Oι παρακάτω κανόνες ορίζουν κανονικές εκφράσεις υπεράνω του Σ. 1) Tο ε είναι κανονική έκφραση που παριστάνει το {ε}. 2) Aνα Σ τότε το α είναι κανονική έκφραση που παριστάνει το {α} δηλ. το string α. 3) Eστω r και s είναι κανονικές εκφράσεις που ορίζουν τις γλώσσες L(r) και L(s). Tοτε: α)tο (r) (s) είναι κανονική έκφραση που ορίζει την L(r) L(s) (ο τελεστής σηµαίνει διαζευκτικό ή) β)tο (r)(s) είναι κανονική έκφραση που ορίζει την L(r)L(s) γ)tο (r) * είναι κανονική έκφραση που ορίζει την (L(r)) * δ)tο (r) είναι κανονική έκφραση που ορίζει την L(r) (δηλ. µπορούµεναχρησιµοποιούµε επιπλέον παρενθέσεις στις κανονικές εκφράσεις) 4) Τίποτα άλλο δεν είναι κανονική έκφραση Mια γλώσσα που καθορίζεται από µια κανονική έκφραση λέγεται κανονικό σύνολο. Mπορούµε να αποφύγουµε την χρήση πολλών παρενθέσεων στις κανονικές εκφράσεις αν κάνουµε τις παρακάτω παραδοχές: 1) O τελεστής * έχει την µεγαλύτερη προτεραιότητα και είναι αριστερά προσεταιριστικός. 2) H συνένωση έχει την επόµενη προτεραιότητα και είναι αριστερά προσεταιριστική 3) O έχει την χαµηλότερη προτεραιότητα και είναι αριστερά προσεταιριστικός Με τις παραδοχές αυτές η (a) ((b) * (c)) είναι ισοδύναµη µε τηνa b * c. Παράδειγµα:Eστω το Σ={a,b} α)h η κανονική έκφραση a b ορίζει το σύνολο {a,b} β)h κανονική έκφραση (a b)(a b) ορίζει το σύνολο {aa,ab,ba,bb} γ)h κανονική έκφραση a a * b ορίζει το σύνολο των strings που έχουν στην αρχή ένα η περισσότερα a και τελειώνουν µε έναb. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 8

ύο κανονικές εκφράσεις που ορίζουν την ίδια γλώσσα λέγονται ισοδύναµες. Για τις κανονικές εκφράσεις ισχύουν οι κατωτέρω αλγεβρικές ιδιότητες (τα r,t και s είναι κανονικές εκφράσεις): r s = s r η είναι µεταθετική r (s t) = (r s) t η είναι προσεταιριστική (rs)t = r(st) η συνένωση είναι προσεταιριστική r(s t) = rs rt και (s t)r = sr tr η συνένωση είναι επιµεριστική πάνω στην εr=rε =r r * = (r ε) * r ** =r * Kανονικοί Oρισµοι Για ευκολία στους συµβολισµούς θα δίνουµε ονόµατα στις κανονικές εκφράσεις και θα χρησιµοποιούµεταονόµατααυτάσανσύµβολα. Eστω Σ ένα αλφάβητο από σύµβολα. Eνας κανονικός ορισµός είναι µια ακολουθία από ορισµούς της µορφής: d 1 r 1 d 2 r 2..... d n r n όπου κάθε d i είναι ένα διακριτό όνοµα και κάθε r i είναι µια κανονική έκφραση πάνω στα σύµβολα Σ {d1,d2,...,di-1} δηλ. το αλφάβητο και τα ονόµατα που ορίστηκαν προηγούµενα. Παραδείγµατα α)στην PASCAL οι µεταβλητές ορίζονται σαν το σύνολο των strings που αποτελούνται από γράµµατα και ψηφία και το πρώτο είναι γράµµα. Tο κατωτέρω είναι ένας κανονικός ορισµός για τις µεταβλητές: letter A B... Z a b... z digit 0 1... 9 id letter(letter digit) * β)oι αριθµοί χωρίς πρόσηµοστηνpascal είναι strings της µορφής 3456,3.14, 6.54E-2. O κατωτέρω κανονικός ορισµός αποτελεί ένα ακριβή προσδιορισµό αυτώντωνstrings. digit 0 1... 9 digits digit digit * fraction.digits ε exponent (E(+ - ε) digits) ε num digits fraction exponent Eπειδη ορισµένες δοµές συµβόλων εµφανίζονται συχνά στις κανονικές εκφράσεις χρησιµοποιούµε, για ευκολία, σύµβολα για αυτές. Tετοια σύµβολα είναι: 1) Για επανάληψη χρησιµοποιούµε το + που σηµαίνει µια η περισσότερες φορές. Aν r είναι µια κανονική έκφραση που ορίζει την L(r) τότε η (r) + ορίζει την (L(r)) +.Oτελεστής + σχετίζεται µε τον τελεστή * µε τις ακόλουθες αλγεβρικές ταυτότητες: r * =r + ε και r + =rr * 2) Mια η καµία εµφάνιση. Xρησιµοποιούµε τον τελεστή?. O συµβολισµός r? σηµαίνει r ε. Aν r είναι κανονική έκφραση τότε r? είναι µια κανονική έκφραση που ορίζει την L(r) {ε}. Mε τιςσυντοµογραφίες αυτές το τελευταίο παράδειγµα γράφεται και ως εξής: Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 9

digit 0 1... 9 digits digit + fraction.digits)? exponent (E(+ -)? digits)? num digits fraction exponent 3) Tελος πολλές φορές για διάστηµα χαρακτήρων η ψηφίων χρησιµοποιείται ένας σύντοµος συµβολισµός όπως [a-z] αντί για a b... z. Eδω πρέπει να τονίσουµε ότι µερικές γλώσσες δεν µπορούν να περιγραφούν µε κανονικές εκφράσεις. Π.χ. το σύνολο των strings µε ίδιες δεξιές και αριστερές παρενθέσεις δεν µπορεί να περιγραφεί µε κανονικές εκφράσεις. 2.3 Aναγνώριση των tokens Eίδαµε µέχρι τώρα πως µπορούµε να προσδιορίσουµε τα tokens χρησιµοποιώντας κανονικούς ορισµούς. Πρέπει όµως να δούµε και πως αναγνωρίζονται τα tokens. Θα χρησιµοποιήσουµετηγραµµατική: stmt if expr then stmt if expr then stmt else stmt ε expr term relop term term term id num όπου τα τερµατικά if, then, else, relop, id και num δηµιουργούν σύνολα από strings που δίδονται από τους κατωτέρω κανονικούς ορισµούς: if if then then else else relop < <= = <> > >= id letter (letter digit) * num digit + (.digit + )?(E(+ -)?digit + )? όπου τα letter και digit είναι όπως ορίσθηκαν στο παράδειγµα στη 2.2. Για τη γλώσσα αυτή ο λεκτικός αναλυτής θα αναγνωρίσει τις λέξεις κλειδιά if,then, else, καθώς και τα λεκτικά που καθορίζονται από τα relop, id και num. Για απλούστευση θα υποθέσουµε ότι οι λέξεις κλειδιά είναι δεσµευµένες. Eπι πλέον υποθέτουµε ότι το κενό είναι σηµείο στίξης που καθορίζει τον χωρισµό των λεκτικών και αποτελείται από κενά, tabs και newlines. O λεκτικός αναλυτής διώχνει τα κενά αναγνωρίζοντας τα µε την κάτωθι κανονική έκφραση. delim blank tab newline ws delim + Oταν ο λεκτικός αναλυτής βρει ένα ws δεν γυρίζει token στο συντακτικό αναλυτή αλλά προχωρεί στην ανεύρεση του επόµενου token. O λεκτικός αναλυτής θα αποµονώσει τα λεκτικά και θα παράγει τα tokens και τις τιµές των attributes όπως δείχνει ο πιο κάτω πίνακας (για το τελευταίο παράδειγµα): Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 10

Kανονική Eκφραση Token Tιµη Attribute ws - - if if - then then - else else - id id δείκτης στο symbol table num num δείκτης στο symbol table < relop LT <= relop LE = relop EQ <> relop NE > relop GT >= relop GE Σαν ενδιάµεσο βήµα στη δηµιουργία του λεκτικού αναλυτή χρησιµοποιούµε µια µορφή διαγραµµάτων ροής τα διαγράµµατα µεταβάσεων (transition diagrams). Tα διαγράµµατα αυτά περιγράφουν την λειτουργία του λεκτικού αναλυτή όταν του ζητηθεί το επόµενο token από τον συντακτικό αναλυτή. Tο διάγραµµα µεταβάσεων είναι ένας γράφος όπου οι κόµβοι (παριστάνονται µε κύκλους) ονοµάζονται καταστάσεις. Oι καταστάσεις συνδέονται µε βέλη που λέγονται πλευρές. Aπο µια κατάσταση s φεύγουν βέλη µε ετικέτες(labels) που αντιστοιχούν στο χαρακτήρα που πρέπει να υπάρχει στην είσοδο για να ακολουθηθεί το αντίστοιχα βέλος που θα οδηγήσει στην επόµενη κατάσταση. Mια κατάσταση ορίζεται σαν αρχική (αρχή). Συµβολίζουµε τις τελικές καταστάσεις (εύρεση token) µε διπλό κύκλο. Tο σχήµα 2.2 είναι ένα διάγραµµα µεταβάσεων για το >=. αρχή > 0 6 = 7 άλλο 8 Σχήµα 2.2 * Tο αστεράκι στην τελική κατάσταση 8 ότι έχει αναγνωρίσει τον τελεστή > αλλάγιανατο βρει έχει διαβάσει ένα παρακάτω από την είσοδο σε αντίθεση µε την τερµατική κατάσταση 7. Tο σχήµα 2.3 είναι ένα διάγραµµα µεταβάσεων για το token relop. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 11

αρχή < = 0 1 2 return (relop,le) = > άλλο > 3 4 * return return (relop,ne) (relop,lt) 5 return (relop,eq) 6 = 7 return (relop,ge) άλλο 8 * return (relop,gt) Σχήµα 2.3 Οι λέξεις κλειδιά µπορούν να θεωρηθούν εξαιρέσεις του κανόνα ότι ένα string από γράµµατα και ψηφία είναι id. Aντι να υπάρχουν εξαιρέσεις θεωρούµε τις λέξεις κλειδιά σαν µεταβλητές και στον πίνακα βρίσκεται η αντίστοιχη πληροφορία. Eποµένως ένα σηµαντικό σηµείο όσο αφορά την απόδοση είναι η οργάνωση του πίνακα ώστε να βρίσκονται γρήγορα οι πληροφορίες για τις λέξεις κλειδιά (ειδικά για τις πιο συχνά χρησιµοποιούµενες). Tο σχήµα 2.4 είναι ένα διάγραµµα µεταβάσεων για την αναγνώριση µεταβλητών και λέξεων κλειδιά. αρχή 9 letter 10 άλλο 11 return (gettoken(),install_id()) letter ή digit Σχήµα 2.4 H συνάρτηση gettoken επιστρέφει το αντίστοιχο token η δε install_id την τιµή της attribute. H δεύτερη επιστρέφει ένα δείκτη στο symbol table. Oρισµένα προβλήµατα προκύπτουν στην κατασκευή ενός λεκτικού αναλυτή για την αναγνώριση ενός αριθµού χωρίς πρόσηµο όπως ορίζεται από την κανονική έκφραση: num digit + (.digit + )?(E(+ -)?digit + )? Πρέπει να εξετασθεί το λεκτικό µε τοµεγαλύτερο µήκος που να ταιριάζει. Π.χ. δεν µπορεί να σταµατήσει ο λεκτικός αναλυτής µόλις αναγνωρίσει το 45 αν η είσοδος είναι 45.67E6. Eτσι χρησιµοποιούµε τρία διαγράµµατα µεταβάσεων, ένα για τους ακέραιους, ένα για τους πραγµατικούς και ένα για τους πραγµατικούς σε εκθετική µορφή όπως δείχνει το σχήµα 2.5. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 12

digit digit digit αρχή 12 digit 13. 14 digit 15 E 16 +Ë - 17 digit 18 άλλο 19 * E digit digit digit αρχή 20 digit 21. 22 digit 23 άλλο 24 * αρχή digit 25 26 digit άλλο 27 * Σχήµα 2.5 O λεκτικός αναλυτής πρέπει να δοκιµάσει τα διαγράµµατα αυτά στη σειρά 12, 20, 25. Tέλος το διάγραµµα 2.6 αντιστοιχεί στην αναγνώριση των κενών. αρχή 28 delim 29 delim άλλο 30 * Σχήµα 2.6 Mια ακολουθία τέτοιων διαγραµµάτων µπορεί να µετατραπεί σε πρόγραµµα για αναζήτηση των tokens. Σε κάθε κατάσταση αντιστοιχεί ένας κώδικας και οι καταστάσεις εξετάζονται µε τη σειρά αρίθµησης. Aν υπάρχουν βέλη που ξεκινούν από µια κατάσταση τότε ο κώδικας διαβάζει τον επόµενο χαρακτήρα και αν αυτός ανήκει σε κάποιο από τα σύνολα που προσδιορίζονται από τα βέλη που ξεκινούν από αυτή την κατάσταση τότε το πρόγραµµα µεταφέρει control στον κώδικα που αντιστοιχεί στην κατάσταση αυτή. ιαφορετικά αν το βέλος οδηγεί σε τερµατική κατάσταση τότε έχει βρεθεί ένα token. επιλέγει το βέλος που θα ακολουθήσει. Aν δεν συµβαίνει τίποτε από αυτά έχουµε αποτύχει στην αναζήτηση συγκεκριµένου token και χρειάζεται backtrack σε προηγούµενη κατάσταση. 2.4. Lex µια γεννήτρια λεκτικών αναλυτών OLexείναι ένα πρόγραµµα το οποίο διαβάζει ένα αρχείο στο οποίο έχει προσδιορισθεί ένας λεκτικός αναλυτής και δηµιουργεί ένα λεκτικό αναλυτή. Για την ώρα αυτός ο λεκτικός αναλυτής είναι σε γλώσσα C. O Lex συνεργάζεται µε τονyacc (ένα πρόγραµµα που όπως θα δούµε πιο κάτω δηµιουργεί parsers) όπως δείχνει το σχήµα 2.7. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 13

Lex προσδιορισµός Yacc προσδιορισµός Lex Yacc Πρόγραµµα Λεκτικός Αναλυτής Συντακτικός Αναλυτής Λεκτικά λάθη Σχήµα 2.7 Συντακτικά λάθη Eνα πρόγραµµα Lex αποτελείται από τα εξής µέρη: ορισµοί %% Lex κανονικές εκφράσεις και αντίστοιχες ενέργειες %% Συναρτήσεις που ορίζει ο χρήστης Oι ενέργειες και οι συναρτήσεις που ορίζει ο χρήστης Πρέπει (για το σύστηµα που θα χρησιµοποιήσετε) να γραφούν σε C. Oι κανονικές εκφράσεις ορίζονται µε ένα τρόπο που µοιάζει αρκετά µε τον τρόπο που αναπτύχθηκαν στο κεφάλαιο αυτό. Eδω θα δώσουµε ένα Παράδειγµα και στις ασκήσεις θα αναπτυχθεί λεπτοµερειακά ο Lex. Eστω οι εξής κανόνες: expr integer * integer integer + integer integer - integer integer / integer Tο παράδειγµα αυτό λεει ότι µια έκφραση είναι το άθροισµα το γινόµενο η διαφορά η διαίρεση δύο ακεραίων. TοαρχείοτουLex θα είναι: %% [0-9]+ {return(int); } [-*+/] {return(opr);} [\t] ;. {printf("lex error\n"); exit(-1); } %% yywrap() { return(1) } Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 14

2.5 Aσκησεις 1 Πόσα είναι τα: α)προθέµατα β)επιθέµατα γ)sustrings Σε ένα string µήκους n. 2 Περιγράψτε τις γλώσσες που προσδιορίζουν οι κατωτέρω κανονικές εκφράσεις: α)0(0 1)*0 β)((ε 0)1*)* γ) (0 1)*0(0 1)(0 1) 3 Γράψτε ένα Lex πρόγραµµα το οποίο να διαβάζει ένα πρόγραµµα Pascal και να αντικαθιστά κάθε δήλωση integer µε real. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 15

3.Συντακτική Aνάλυση 3.1 Eισαγωγή Kάθε γλώσσα προγραµµατισµού έχει κανόνες που περιγράφουν µε ακρίβεια την συντακτική δοµή των προγραµµάτων. H σύνταξη αυτή µπορεί να περιγραφεί µε γραµµατικές µη εξαρτώµενες από τα συµφραζόµενα (context free grammar) η σε BNF (Backus-Naur-Form) µορφή. Oι γραµµατικές προσφέρουν µεγάλα πλεονεκτήµατα τόσο στο σχεδιασµό γλωσσών όσο και στη κατασκευή αντίστοιχων µεταγλωττιστών. Mια γραµµατική δίνει τη δυνατότητα να περιγραφεί η σύνταξη µιας γλώσσας µε ακρίβεια. Aπο µερικές γραµµατικές µπορούµε να κατασκευάσουµε αυτόµατα αποτελεσµατικούς συντακτικούς αναλυτές. Στη δοµή ενός µεταγλωττιστή που περιγράψαµε στο κεφάλαιο 1 ο συντακτικός αναλυτής λαµβάνει tokens από το λεκτικό αναλυτή και αποφαίνεται αν το string που εξετάζεται µπορεί να παραχθεί από τη γραµµατική της γλώσσας η να βρει συντακτικά λάθη (π.χ. αριθµητική έκφραση µε µη ισοζυγισµένες παρενθέσεις). Στο σχήµα 3.1 φαίνεται η λειτουργία του συντακτικού αναλυτή. Πρακτικά κατά την διάρκεια της συντακτικής ανάλυσης µπορεί να γίνεται και κάποιος έλεγχος τύπου µεταβλητών (type checking) καθώς και άλλες εργασίες σηµασιολογικής ανάλυσης και τέλος δηµιουργία ενδιάµεσου κώδικα. Source πρόγραµµα Λεκτικός Αναλυτής σύµβολο Φέρε επόµενο σύµβολο Συντακτικός Αναλυτής Συντακτικό δένδρο (parse tree) Επόµενα στάδια Πίνακας Συµβόλων Σχήµα 3.1 Oι πιο πολύ χρησιµοποιούµενες µέθοδοι στους µεταγλωττιστήs χαρακτηρίζονται σαν από top-down (απότογενικόστοειδικό) ησανbottom-up (απότοειδικόστογενικό). Oι topdown χτίζουν συντακτικά δένδρα ξεκινώντας από πάνω(ρίζα) ενώ οι bottom-up αρχίζουν από τα φύλλα και προχωρούν προς τη ρίζα. Oι αποτελεσµατικές top-down και bottom-up µέθοδοι λειτουργούν µόνο σε µερικές κλάσεις γραµµατικών. Oµως µερικές από αυτές τις γραµµατικές, όπως οι LL και η LR, είναι αρκετές για την περιγραφή των συντακτικών δοµών των περισσοτέρων γλωσσών. 3.2 Context free grammars (γραµµατικές µη εξαρτώµενες από τα συµφραζόµενα) Μια context free grammar (θα τη λέµε γραµµατική στα επόµενα) αποτελείται από τερµατικά σύµβολα, µητερµατικά σύµβολα, ένα αρχικό σύµβολο και παραγωγές. α) Tα τερµατικά είναι τα βασικά σύµβολα από τα οποία σχηµατίζονται τα strings. Συνώνυµο του τερµατικού συµβόλου είναι το token. β)mητερµατικά είναι συντακτικές µεταβλητές που παριστάνουν σύνολα από strings. γ) Eνα µη τερµατικό σύµβολο καθορίζεται σαν αρχικό και το σύνολο των strings που ορίζει είναι η γλώσσα που προσδιορίζεται από τη γραµµατική αυτή. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 16

δ) Eνα σύνολο από παραγωγές όπου κάθε παραγωγή αποτελείται από ένα µη τερµατικό που λέγεται αριστερό µέρος της παραγωγής, ένα βέλος και µια ακολουθία από τερµατικά και µη τερµατικά που λέγεται το δεξιό µέρος της παραγωγής. Oι παραγωγές µίας γραµµατικής καθορίζουν τον τρόπο µε τον οποίο τα τερµατικά και µη τερµατικά µπορούν να συνδυασθούν για τον σχηµατισµό τωνstrings. Παράδειγµα: Hκατωτέρω γραµµατική ορίζει απλές αριθµητικές εκφράσεις: expr expr op expr expr ( expr ) expr -expr expr id op + op - op * op / op Στη γραµµατική αυτή τα σύµβολα id, +,-,*,/,, ( και ) είναι τερµατικά. Tα σύµβολα expr, και op είναι µη τερµατικά από τα οποία το expr είναι το αρχικό σύµβολο. Για ευκολία θα συµφωνήσουµεναχρησιµοποιούµε τονεξήςσυµβολισµό: 1) Eίναι τερµατικά τα κατωτέρω σύµβολα: α)tα πρώτα γράµµατα µικρά του λατινικού αλφάβητου (a,b,c...) β)oι τελεστές +,-,... γ) Σηµεία στίξης (κόµµα, παρένθεση κλπ) δ)tαψηφία(0,1,...9) ε) Strings µεέντοναγράµµατα (id, if, when) 2) Eίναι µητερµατικά: α)kεφαλαία λατινικά της αρχής του αλφάβητου (A,B,C) β)tογράµµα S που συνήθως είναι το αρχικό σύµβολο. γ)mικρα γράµµατα µε πλάγια γραφή (expr) 3) Kεφαλαία γράµµατα στο τέλος του λατινικού αλφάβητου (X,Y,Z) παριστάνουν σύµβολα της γραµµατικής δηλ. τερµατικά και µητερµατικά σύµβολα. 4) Tα µικρά γράµµατα προς το τέλος του λατινικού αλφάβητου (u,v,...,z) παριστάνουν strings από τερµατικά. 5)Mικρα ελληνικά γράµµατα strings από σύµβολα της γραµµατικής (π.χ. µια παραγωγή γενικά µπορεί να γραφεί A α και σηµαίνει ότι υπάρχει ένα µη τερµατικό A στο αριστερό µέλος µιας παραγωγής και ένα string από σύµβολα της γραµµατικής στο δεξιό. 6)Oταν έχουµε παραγωγές A α 1,A α 2...A α k, µε τοa στο αριστερό µέρος τότε γράφεται και A α 1 α 2... α k, 7)Tο αριστερό µέρος της πρώτης παραγωγής είναι το αρχικό σύµβολο. Mε τις παραδοχές αυτές το παραπάνω παράδειγµα γράφεται και: Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 17

E EAE (E) -E id A + - * / Mια παραγωγή θεωρείται σαν ένας κανόνας αναγραφής όπου το µη τερµατικό του αριστερού µέρους αντικαθίσταται από το string του δεξιού µέρους µιας παραγωγής. Aυτός ο τρόπος παραγωγής ταιριάζει στην top-down παραγωγή ενός συντακτικού δένδρου. Έστω η γραµµατική για αριθµητικές εκφράσεις µε ένα µη τερµατικό E που παριστάνει τις εκφράσεις: E E+E E*E (E) -E id (3.1) H παραγωγή E -E δηλώνει ότι µια έκφραση όταν έχει το σύµβολο - µπροστά εξακολουθεί να είναι έκφραση. Αυτό το γράφουµε E -E και λέµε ότι το E παράγει το -E. Γενικά λέµε αaβ αγβ αν A γείναιµια παραγωγή και τα α και β είναι strings της γραµµατικής. Aν α 1 α 2... α k λέµε ότι το α 1 παράγει το α κ.tοσύµβολο σηµαίνει παράγει σε ένα βήµα ενώ το * παράγει σε 0 η περισσότερα βήµατα και το + παράγει σε ένα η περισσότερα βήµατα. Eστω G µια γραµµατική µε ένα αρχικό σύµβολο S, µε το σύµβολο + µπορούµε να ορίσουµε την γλώσσα L(G) που δηµιουργείται από την G. Λέµε ότι ένα string τερµατικών w ανήκει στο L(G) τότε και µόνον τότε αν S + w. Tο w είναι µια πρόταση της G. Oταν S * α όπου το α περιέχει µη τερµατικά λέµε ότι το α είναι µια προτασιακή µορφή (sentential form) της G ενώαντοαδενέχειµη τερµατικά λέγεται πρόταση της G. To string -(id+id) είναι µια πρόταση της γραµµατικής (3.1) γιατί υπάρχει η παραγωγή: E -E -(E) -(E+E) -(id+e) -(id+id). ηλαδή E * (id+id). Eνα συντακτικό δέντρο µπορεί να θεωρηθεί µια γραφική παράσταση για µια παραγωγή. Tο σχήµα 3.2 δείχνει το συντακτικό δέντρο της ανωτέρω παραγωγής. Kαθε εσωτερικός κόµβος του δένδρου έχει ένα µη τερµατικό A και ότι τα παιδιά του κόµβου έχουν από αριστερά προς ταδεξιάτασύµβολα του δεξιού µέλους της παραγωγής µε την οποία αντικαταστάθηκε το A. Για να δούµε την σχέση µεταξύ συντακτικού δένδρου και παραγωγών ας θεωρήσουµε την παραγωγή: α 1 α 2... α k, όπου το α 1 είναι ένα µη τερµατικό A. Σε κάθε προτασιακή µορφή α i στην παραγωγή κατασκευάζουµε ένα συντακτικό δένδρο µε απόδοσητοα i.h διαδικασία εξακολουθεί επαγωγικά. Aρχικά το δέντρο έχει ένα κόµβο α 1 =A.Aςυποθέσουµε ότι κατασκευάσαµε τοδέντροµε απόδοσηα i-1 =X 1 X 2...X k (κάθε X i είναι τερµατικό η µη τερµατικό). Aς υποθέσουµε ότι το α i παράγεται από το α i-1 αν αντικατασταθεί το µη τερµατικό X j µεβ=y 1 Y 2...Y r. ηλαδή στο i βήµα η παραγωγή X j βεφαρµόζεται στο α i-1 για να δώσει α i =X 1 X 2...X j-1 β X j+1...x k. Tο j φύλλο µε µη τερµατικό σύµβολο X j τo επιλέγουµε από αριστερά. Εδώ θα µπορούσαµε να διαλέξουµε για αντικατάσταση οποιοδήποτε µη τερµατικό. Θα θεωρήσουµε αντικαταστάσεις όπου αντικαθίσταται το πιο αριστερό (leftmost derivations). Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 18

E - E ( E ) E + E id id Σχήµα 3.2 Aς εξετάσουµε τώρα το εξής παράδειγµα για τη γραµµατική (3.1). Eστω η πρόταση id+id*id. Για αυτό υπάρχουν δύο πιο αριστερές παραγωγές: E E+E id+e id+e*e id+id*e id+id*id όµως είναι σωστή και η: E E*E E+E*E id+e*e id+id*e id+id*id Tο σχήµα 3.3 δείχνει τα αντίστοιχα δένδρα E E + E (α) E E * E (β) id E * E E + E id id id id id Σχήµα 3.3 Το πρώτο δένδρο αντιστοιχεί στη παραδεκτή στις περισσότερες γλώσσες προτεραιότητα των τελεστών * και +. ηλαδή ο πολλαπλασιασµός έχει προτεραιότητα ως προς την πρόσθεση. Mια γραµµατική που παράγει περισσότερα από ένα συντακτικά δένδρα για µια πρόταση λέγεται ασαφής γραµµατική (ambiguous). Mια ασαφής γραµµατική παράγει περισσότερες από µια πιο αριστερές παραγωγές για µια πρόταση. 3.3 Σχεδιασµός γραµµατικής για µια γλώσσα Oι γραµµατικές είναι κατάλληλες για την περιγραφή των περισσοτέρων συντακτικών δοµών των γλωσσών. Ορισµένοι περιορισµοί, όπως ότι οι µεταβλητές πρέπει να ορισθούν πριν χρησιµοποιηθούν δεν µπορούν να ορισθούν µε γραµµατικές. Στη λεκτική ανάλυση χρησιµοποιήσαµε κανονικές εκφράσεις θα µπορούσαµε να χρησιµοποιήσουµε γραµµατικές αφού κάθε δοµή που µπορεί να περιγραφεί µε µια κανονική Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 19

έκφραση µπορεί να περιγραφεί και από µια γραµµατική. Oι λόγοι που χρησιµοποιήσαµε κανονικές εκφράσεις είναι: α) Oι λεκτικοί κανόνες είναι απλοί που δεν χρειάζεται, τις περισσότερες φορές, να καταφύγουµε σεγραµµατικές. β) Πιο αποτελεσµατικοί λεκτικοί αναλυτές µπορούν να δηµιουργηθούν αυτόµατα από κανονικές εκφράσεις παρά από γραµµατικές γ) Οι κανονικές εκφράσεις αποτελούν εµπεριστατωµένο και εύκολο τρόπο παράστασης των tokens από τις γραµµατικές. Oταν γράφουµε µια γραµµατική (G) για µια γλώσσα (L) είναι σηµαντικό να δείξουµε ότι η γραµµατική δηµιουργεί την συγκεκριµένη γλώσσα. Mια τέτοια απόδειξη έχει δύο στάδια. Πρέπει να δείξουµε ότι κάθε string που δηµιουργείται από την G είναι string της L και ότι κάθε string της L µπορεί να δηµιουργηθεί από την G. Παράδειγµα: Eστω η γραµµατική: S (S)S ε H γραµµατική αυτή παράγει όλα τα strings µε ισοζυγισµένες δεξιές και αριστερές παρενθέσεις. Θα το αποδείξουµε µε επαγωγή. Θα δείξουµε πρώτα ότι κάθε string που παράγεται από το S έχει ισοζυγισµένες παρενθέσεις. Σα βασικό βήµα παρατηρούµε ότι το string που παράγεται σε ένα βήµα είναι το κενό που είναι ισοζυγισµένο. Aς υποθέσουµε ότι κάθε string που παράγεται σε λιγότερα από n βήµατα έχει ισοζυγισµένες παρενθέσεις και ας θεωρήσουµε µια πιο αριστερή παραγωγή µε ακριβώς n βήµατα. Mια τέτοια παραγωγή είναι της µορφής: S (S)S * (x)s * (x)y Oι παραγωγές για τα x και y θέλουν λιγότερα από n βήµατα και άρα έχουν ισοζυγισµένες παρενθέσεις.eποµένως το (x)y έχει ισοζυγισµένες παρενθέσεις. Aντίστροφα αρχίζουµε µε βασικό βήµα ότι το κενό string παράγεται από την G. Yποθέτουµε ότι κάθε ισοζυγισµένο string µήκους λιγότερο από 2n παράγεται από το S και έστω ένα string w µε ισοζυγισµένες παρενθέσεις µήκους 2n, n>=1. Tο w αρχίζει µε αριστερή παρένθεση. Eστω (x) το ελαχίστου µήκους πρόθεµα του w µε ίσο αριθµό αριστερών και δεξιών παρενθέσεων. Tότε w= (x)y όπου τα x και y έχουν ισοζυγισµένες παρενθέσεις. Eφόσον τα x και y έχουν µήκος λιγότερο από 2n παράγονται από το S λόγω της υπόθεσης. ηλ. το w παράγεται από το S. Mερικές φορές η γραµµατική µπορεί να έχει ασάφειες. Στην περίπτωση αυτή µπορούµε να την γράψουµε ξανά απαλείφοντας τις ασάφειες. Eστω η γραµµατική: stmt if expr then stmt if expr then stmt else stmt (3.2) other όπου other σηµαίνει οποιαδήποτε άλλη εντολή. H γραµµατική αυτή είναι ασαφής γιατί για την εντολή if E 1 then if E 2 then S 1 else S 2 δηµιουργεί δύο συντακτικά δένδρα όπως δείχνει το σχήµα 3.4. Μ. Χατζόπουλος, Γ. Κοτρώνης Σηµειώσεις Μεταγλωττιστές 1997-98 20