Mεταγλωττιστές - WordPress.com · 2010. 1. 31. · 3.3.4 kατασκευή του...

168
Mεταγλωττιστές Σηµείωση Το ΕΑΠ είναι υπεύθυνο για την επιµέλεια έκδοσης και την ανάπτυξη των κειµένων σύµφωνα µε τη Μεθο- δολογία της εξ Αποστάσεως Εκπαίδευσης. Για την επιστηµονική αρτιότητα και πληρότητα των συγγραµ- µάτων την αποκλειστική ευθύνη φέρουν οι συγγραφείς, κριτικοί αναγνώστες και ακαδηµαϊκοί υπεύθυνοι που ανέλαβαν το έργο αυτό. ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 1

Transcript of Mεταγλωττιστές - WordPress.com · 2010. 1. 31. · 3.3.4 kατασκευή του...

  • Mεταγλωττιστές

    ΣηµείωσηΤο ΕΑΠ είναι υπεύθυνο για την επιµέλεια έκδοσης και την ανάπτυξη των κειµένων σύµφωνα µε τη Μεθο-δολογία της εξ Αποστάσεως Εκπαίδευσης. Για την επιστηµονική αρτιότητα και πληρότητα των συγγραµ-µάτων την αποκλειστική ευθύνη φέρουν οι συγγραφείς, κριτικοί αναγνώστες και ακαδηµαϊκοί υπεύθυνοιπου ανέλαβαν το έργο αυτό.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 1

  • ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 2

  • ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟΣχολή Θετικών Επιστηµών και Τεχνολογίας

    Πρόγραµµα Σπουδών

    ΠΛHPOΦOPIKH

    Θεµατική Ενότητα

    ΠΡΑΚΤΙΚΗ ΕΞΑΣΚΗΣΗ ΣΕ ΘΕΜΑΤΑ ΛΟΓΙΣΜΙΚΟΥ

    Τόµος A'

    MεταγλωττιστέςΠΑΝΑΓΙΩΤΗΣ ΠΙΝΤΕΛΑΣ ΠΑΝΑΓΙΩΤΗΣ ΑΛΕΦΡΑΓΚΗΣ

    Kαθηγητής Tµήµατος Mαθηµατικών ∆ιδάκτωρ Hλεκτρολόγος Mηχανικός &Πανεπιστηµίου Πατρών Tεχνολογίας H/Y

    ΠATPA 2003

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 3

  • ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

    Σχολή Θετικών Επιστηµών και Τεχνολογίας

    Πρόγραµµα Σπουδών

    ΠΛHPOΦOPIKH

    Θεµατική Ενότητα

    ΠΡΑΚΤΙΚΗ ΕΞΑΣΚΗΣΗ ΣΕ ΘΕΜΑΤΑ ΛΟΓΙΣΜΙΚΟΥ

    Τόµος A'

    MΕΤΑΓΛΩΤΤΙΣΤΕΣ

    Συγγραφή

    ΠANAΓIΩTHΣ ΠINTEΛAΣ ΠANAΓIΩTHΣ AΛEΦPAΓKHΣ

    Kαθηγητής Tµήµατος Mαθηµατικών ∆ιδάκτωρ Hλεκτρολόγος Mηχανικός &

    Πανεπιστηµίου Πατρών Tεχνολογίας H/Y

    Κριτική Ανάγνωση

    ΣΩΚΡΑΤΗΣ ΚΑΤΣΙΚΑΣ

    Kαθηγητής Tµήµατος Mηχανικών Πληροφοριακών και Eπικοινωνιακων Συστηµάτων

    Πανεπιστηµίου Aιγαίου

    Ακαδηµαϊκός Υπεύθυνος για την επιστηµονική επιµέλεια του τόµου

    ΠΑΝΑΓΙΩΤΗΣ ΠΙΝΤΕΛΑΣ

    Kαθηγητής Tµήµατος Mαθηµατικών Πανεπιστηµίου Πατρών

    Επιµέλεια στη µέθοδο της εκπαίδευσης από απόσταση

    ΓEPAΣIMOΣ MΩPAΪTHΣ

    Γλωσσική Επιµέλεια

    XPIΣTINA KAPAΓEΩPΓOΠOYΛOY

    Τεχνική Επιµέλεια

    EΣΠI EK∆OTIKH E.Π.E.

    Καλλιτεχνική Επιµέλεια – Σελιδοποίηση

    TYPORAMA

    Συντονισµός ανάπτυξης εκπαιδευτικού υλικού και γενική επιµέλεια των εκδόσεων

    ΟΜΑ∆Α ΕΚΤΕΛΕΣΗΣ ΕΡΓΟΥ ΕΑΠ / 1997 – 2003

    ISBN: 960–538–209–1

    Kωδικός Έκδοσης: ΠΛH 40/1

    Copyright 2003 για την Ελλάδα και όλο τον κόσµο

    ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

    Οδός Παπαφλέσσα & Υψηλάντη, 26222 Πάτρα – Τηλ: 2610 314094, 314206 Φαξ: 2610 317244

    Σύµφωνα µε το Ν. 2121/1993, απαγορεύεται η συνολική ή αποσπασµατική αναδηµοσίευση του βιβλίου αυτού

    ή η αναπαραγωγή του µε οποιοδήποτε µέσο χωρίς την άδεια του εκδότη.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 4

  • ¶ÂÚȯfiÌÂÓ·

    Πρόλογος ............................................................................................................................................................................. 11

    K ∂ º ∞ § ∞ π √ 1EÈÛ·ÁˆÁ‹

    Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,Eισαγωγικές παρατηρήσεις .................................................................................................................................... 13

    1.1 Eισαγωγή ............................................................................................................................................................. 14

    1.2 H δοµή ενός µεταγλωττιστή ............................................................................................................... 15

    1.2.1 O λεκτικός αναλυτής ................................................................................................................. 15

    1.2.2 O συντακτικός αναλυτής ....................................................................................................... 16

    1.2.3 O σηµασιολογικός αναλυτής .............................................................................................. 16

    1.2.4 O γεννήτορας ενιάµεσου κώδικα .................................................................................... 17

    1.2.5 Oι βελτιστοποιητές υψηλού και µεσαίου επιπέδου ........................................ 17

    1.2.6 O γεννήτορας τελικού κώδικα ........................................................................................... 18

    1.2.7 O βελτιστοποιητής χαµηλού επιπέδου ....................................................................... 18

    1.2.8 O πίνακας συµβόλων ................................................................................................................ 18

    1.3 Eργαλεία ανάπτυξης µεταγλωττιστών ....................................................................................... 19

    1.3.1 Tα Lex & Flex ................................................................................................................................. 19

    1.3.2 Ta Yacc & Bison ............................................................................................................................ 19

    1.3.3 To PCCTS ........................................................................................................................................... 20

    1.3.4 To SPIM ............................................................................................................................................... 20

    1.3.5 To WARTS ......................................................................................................................................... 20

    Σύνοψη ................................................................................................................................................................................... 22

    K ∂ º ∞ § ∞ π √ 2O °ÂÓÓ‹ÙÔÚ·˜ §ÂÎÙÈÎÒÓ AÓ·Ï˘ÙÒÓ Lex

    Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,Eισαγωγικές παρατηρήσεις .................................................................................................................................... 23

    2.1 Eισαγωγή ............................................................................................................................................................. 24

    2.2 Προγραµµατίζοντας µε το Lex .......................................................................................................... 25

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 5

  • 6 M ∂ ∆∞ ° § ø ∆ ∆ π ™ ∆ ∂ ™

    2.3 Γράφοντας κανόνες στο Lex ............................................................................................................... 25

    2.3.1 Kλάσεις χαρακτήρων ................................................................................................................ 26

    2.3.2 Προαιρετικές εκφράσεις ........................................................................................................ 27

    2.3.3 Eπαναληπτικές εκφράσεις .................................................................................................... 27

    2.3.4 Eκφράσεις εναλλαγής ............................................................................................................... 27

    2.3.5 Eκφράσεις οµαδοποίησης ..................................................................................................... 27

    2.3.6 Eυαισθησία συµφραζοµένων ............................................................................................. 28

    2.3.7 Eπανάληψη και χρήση ορισµών ...................................................................................... 28

    2.4 Oι ενέργειες του Lex .................................................................................................................................. 30

    2.5 O µηχανισµός ταύτισης του Lex ...................................................................................................... 31

    2.6 Oι δοµές και οι συναρτήσεις του Lex ......................................................................................... 31

    2.7 Oι αρχικές συνθήκες του Lex ............................................................................................................. 32

    2.8 Xρησιµοποιώντας το Lex ....................................................................................................................... 33

    2.9 Tο Lex σε συνεργασία µε το Yacc .................................................................................................. 34

    Σύνοψη ................................................................................................................................................................................... 35

    Bιβλιογραφία ...................................................................................................................................................................... 36

    Προαιρετική βιβλιογραφία ..................................................................................................................................... 36

    K ∂ º ∞ § ∞ π √ 3™˘ÓÙ·ÎÙÈ΋ AÓ¿Ï˘ÛË [LL Î·È LR]

    Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,Eισαγωγικές παρατηρήσεις .................................................................................................................................... 39

    3.1 Συντακτική ανάλυση ................................................................................................................................. 41

    3.2 Συντακτικοί αναλυτές Top down .................................................................................................... 43

    3.2.1 Γραµµατικές LL(1) ..................................................................................................................... 43

    3.3 Συντακτικοί αναλυτές Bottom up ................................................................................................... 45

    3.3.1 Γραµµατικές LR(1) και γλώσσες ................................................................................... 46

    3.3.2 Συντακτικοί αναλυτές LR(k) .............................................................................................. 47

    3.3.3 Λειτουργία του συντακτικού αναλυτή LR ............................................................. 49

    3.3.4 Kατασκευή του πίνακα συντακτικής ανάλυσης LR ....................................... 51

    3.3.5 Σύγκριση των µεθόδων ανάλυσης LL και LR .................................................... 52

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 6

  • 3.4 Aνάνηψη από λάθη ..................................................................................................................................... 53

    3.4.1 Στρατηγικές ανάνηψης από λάθος ................................................................................ 55

    3.4.2 Aνάνηψη από λάθος σε συντακτικό αναλυτή LR ............................................ 56

    Σύνοψη ................................................................................................................................................................................... 59

    K ∂ º ∞ § ∞ π √ 4O °ÂÓÓ‹ÙÔÚ·˜ ™˘ÓÙ·ÎÙÈÎÒÓ AÓ·Ï˘ÙÒÓ

    Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,Eισαγωγικές παρατηρήσεις .................................................................................................................................... 61

    4.1 Eισαγωγή ............................................................................................................................................................. 62

    4.1.1 Περιγράφοντας µια γραµµατική ...................................................................................... 64

    4.1.2 Προγραµµατίζοντας µε το yacc ....................................................................................... 65

    4.2 To τµήµα δηλώσεων του yacc ........................................................................................................... 65

    4.3 Γράφοντας κανόνες στο yacc ............................................................................................................. 67

    4.4 ∆ιαχείριση ασαφειών ................................................................................................................................ 73

    4.5 ∆ιαχείριση σφαλµάτων ............................................................................................................................ 74

    4.6 ∆ιασύνδεση µε άλλα προγράµµατα της C .............................................................................. 75

    4.7 Aποσφαλµάτωση της γραµµατικής .............................................................................................. 77

    4.8 Xρησιµοποιώντας το yacc .................................................................................................................... 78

    Σύνοψη ................................................................................................................................................................................... 79

    Bιβλιογραφία ................................................................................................................................................................... 81

    K ∂ º ∞ § ∞ π √ 5¢ËÌÈÔ˘ÚÁÒÓÙ·˜ KÒ‰Èη ÁÈ· ÙÔ Spim

    Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,Eισαγωγικές παρατηρήσεις .................................................................................................................................... 83

    5.1 Eισαγωγή ............................................................................................................................................................. 84

    5.2 O επεξεργαστής MIPS R2000 ........................................................................................................... 84

    5.3 H σύνταξη του συβολοµεταφραστή του Spim και ηεπικοινωνία µε το λειτουργικό σύστηµα .................................................................................. 85

    5.4 ∆ιαχείριση µνήµης ...................................................................................................................................... 88

    7¶ E P I E X O M E N A

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 7

  • 8 M ∂ ∆∞ ° § ø ∆ ∆ π ™ ∆ ∂ ™

    5.5 Eντολές του MIPS ....................................................................................................................................... 89

    5.5.1 Aριθµητικές και λογικές πράξεις .................................................................................... 91

    5.5.2 Oι βασικές εντολές σύγκρισης ......................................................................................... 93

    5.5.3 Oι βασικές εντολές ελέγχου ροής .................................................................................. 93

    5.5.4 Oι βασικές εντολές ανάκλησης από µνήµη και αποθήκευσηςσε µνήµη .............................................................................................................................................. 95

    5.5.5 Kλήσεις συναρτήσεων ............................................................................................................. 95

    Σύνοψη ................................................................................................................................................................................... 98

    Bιβλιογραφία ...................................................................................................................................................................... 99

    K ∂ º ∞ § ∞ π √ 6¢ÈÂÚÌËÓÂ˘Ù¤˜

    Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,Eισαγωγικές παρατηρήσεις ................................................................................................................................ 101

    6.1 Eισαγωγή .......................................................................................................................................................... 103

    6.2 H δοµή του διερµηνευτή ..................................................................................................................... 103

    6.3 Oι τιµές µέσα στη στοίβα ................................................................................................................... 105

    6.4 Mετατροπή των εντελών .................................................................................................................... 108

    6.5 ∆ιαχείριση µνήµης ................................................................................................................................... 109

    6.6 Bοηθήµατα εκσφαλµάτωσης ........................................................................................................... 109

    Σύνοψη ................................................................................................................................................................................ 111

    K ∂ º ∞ § ∞ π √ 7™¯Â‰È¿˙ÔÓÙ·˜ Î·È Î·Ù·Û΢¿˙ÔÓÙ·˜ ¤Ó·Ó ÌÂÙ·ÊÚ·ÛÙ‹

    Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά,Eισαγωγικές παρατηρήσεις ................................................................................................................................. 113

    7.1 Σχεδιάζοντας ένα µεταγλωττιστή για µια γλώσσα προγραµµατισµού ........ 115

    7.2 Σύντοµη περιγραφή της Mini–C .................................................................................................. 116

    7.3 Kατασκευή του πίνακα συµβόλων ............................................................................................. 117

    7.3.1 Oνόµατα και εµβέλεια .......................................................................................................... 117

    7.4 Kατασκευή του λεκτικού αναλυτή ............................................................................................. 119

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 8

  • 7.4.1 Aντιµετώπιση λαθών ............................................................................................................. 120

    7.5 Kατασκευή του συντακτικού & σηµασιολογικού αναλυτή .................................. 121

    7.6 Kατασκευή του ενδιάµεσου κώδικα ......................................................................................... 125

    7.6.1 Kατασκευή της αναπαράστασης τριών διευθύνσεων ................................ 125

    7.6.2 ∆ηµιουργία ενιδάµεσου κώδικα ................................................................................... 126

    7.6.3 Eκφράσεις ........................................................................................................................................ 126

    7.6.4 Λογικές εκφράσεις ................................................................................................................... 127

    7.6.5 Eντολές ελέγχου ροής ........................................................................................................... 129

    7.6.6 Oρισµός και κλήση συναρτήσεων .............................................................................. 130

    7.7 Kατασκευή τελικού κώδικα ή διερµηνεία ........................................................................... 131

    7.7.1 Mεθοδολογία ανάπτυξης τελικού κώδικα ............................................................ 131

    7.7.2 ∆ηµιουργία συµβολικού κώδικα για συναρτήσεις ....................................... 133

    Σύνοψη ................................................................................................................................................................................ 135

    Bιβλιογραφία ................................................................................................................................................................... 135

    Aπαντήσεις Aσκήσεων Aυτοαξιολόγησης ............................................................................................... 137

    Aπαντήσεις ∆ραστηριοτήτων ............................................................................................................................ 149

    Γενική Bιβλιογραφία ............................................................................................................................................... 165

    9¶ E P I E X O M E N A

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 9

  • ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 10

  • ¶ÚfiÏÔÁÔ˜

    Ο τόµος που έχετε στα χέρια σας αποτελεί συνέχεια του τόµου «Μεταγλωττιστές», του

    οποίου θα πρέπει να έχετε µελετήσει και ολοκληρώσει τις Ασκήσεις Αυτοαξιολόγησης,

    όπως, φυσικά, και τις ∆ραστηριότητες που περιλαµβάνει. Βασικός στόχος του τόµου

    είναι να σας βοηθήσει να συµπληρώσετε τις γνώσεις σας στους µεταφραστές γενικό-

    τερα, αλλά και να αποκτήσετε πρακτική εµπειρία στην κατασκευή ένος πραγµατικού

    (αλλά προφανώς µικρού, λόγω όγκου δουλειάς) µεταγλωττιστή ή διερµηνευτή.

    Ο τόµος αυτός έχει γίνει προσπάθεια να γραφτεί σύµφωνα µε τις οδηγίες και τα πρό-

    τυπα του Ελληνικού Ανοικτού Πανεπιστηµίου και προέρχεται από υλικό το οποίο

    διδάσκεται στο Τµήµα Μηχανικών Η/Υ και Πληροφορικής του Πανεπιστηµίου

    Πατρών. Για να φτάσει ο τόµος στη µορφή αυτή, βοήθησαν σηµαντικά τόσο τα σχό-

    λια του Κριτικού Αναγνώστη, συνάδελφου Ι. Κοτρώνη, όσο και του επίσης συνά-

    δελφου και Ακαδηµαϊκού Υπεύθυνου της Θεµατικής Ενότητας Σ. Κάτσικα. Με την

    ευκαιρία αυτή θέλουµε να ευχαριστήσουµε θερµά και τους δύο.

    Στο Kεφάλαιο 1 θα δείτε την αρχιτεκτονική δοµή ενός µεταγλωττιστή, τις διαδικα-

    σίες ανάπτυξής του και θα έρθετε σε µια πρώτη επαφή µε τα εργαλεία που θα χρη-

    σιµοποιήσετε, αργότερα για να αναπτύξετε και εσείς έναν τέτοιο µεταφραστή.

    Στο Kεφάλαιο 2 θα µάθετε πώς µπορείτε να περιγράφετε τις λεκτικές µονάδες

    (tokens) µιας γλώσσας και πώς µπορείτε να κατασκευάζετε ένα λεκτικό αναλυτή, ο

    οποίος θα αναγνωρίζει λεκτικές µονάδες από την είσοδό του. Για να επιτύχετε αυτό

    το σκοπό, θα µάθετε να χρησιµοποιείτε το πιο δηµοφιλές εργαλείο κατασκευής λεκτι-

    κών αναλυτών, το lex.

    Το Kεφάλαιο 3 περιέχει υλικό το οποίο θα σας βοηθήσει στην κατανόηση του τρό-

    που λειτουργίας των συντακτικών αναλυτών της κατηγορίας LL και (κυρίως) LR,

    όπως αυτοί οι οποίοι παράγονται από το εργαλείο Yacc, το οποίο και θα χρησιµο-

    ποιήσετε για την κατασκευή µεταγλωττιστών.

    Το Kεφάλαιο 4 θα σας υπενθυµίσει πώς µπορείτε να περιγράφετε τη συντακτική

    δοµή µιας γλώσσας προγραµµατισµού και πώς µπορείτε να κατασκευάζετε ένα

    συντακτικό αναλυτή, ο οποίος θα αναγνωρίζει τη συντακτική δοµή από την είσοδό

    του. Για να επιτύχετε αυτό το σκοπό, θα µάθετε να χρησιµοποιείτε το πιο δηµοφιλές

    εργαλείο κατασκευής συντακτικών αναλυτών, το Yacc.

    Στο Kεφάλαιο 5 θα µάθετε την παραγωγή τελικού κώδικα για την αρχιτεκτονική επε-

    ξεργαστών RISC. Για να το επιτύχετε αυτό, θα µάθετε τη δοµή και το ρεπερτόριο

    εντολών του εξοµοιωτή της γενιάς επεξεργαστών MIPS R2/3Κ spim και τις σηµα-

    ντικότερες εντολές του επεξεργαστή.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 11

  • 1 2 M ∂ ∆∞ ° § ø ∆ ∆ π ™ ∆ ∂ ™

    Στο Kεφάλαιο 6 περιγράφεται η οργανωτική δοµή και ο τρόπος λειτουργίας των

    διερµηνευτών, έτσι ώστε να είστε σε θέση όχι µόνο να κατανοείτε, αλλά και να

    κατασκευάζετε έναν απλό διερµηνευτή.

    Στο τελευταίο κεφάλαιο θα κατασκευάσετε τον πρώτο σας µεταγλωττιστή ή διερµη-

    νευτή. Η γλώσσα την οποία καλείστε να µεταφράσετε ή να διερµηνεύσετε είναι ένα

    υποσύνολο της γλώσσας προγραµµατισµού C. Για να επιτύχετε αυτό το σκοπό, θα

    µάθετε πώς µπορείτε να χρησιµοποιείτε τη γνώση που αποκτήσατε στα προηγούµε-

    να κεφάλαια µέσα από ένα σύνολο ∆ραστηριοτήτων, οι οποίες θα σας κατευθύνουν

    µε συστηµατικό τρόπο στην τελική κατασκευή του µεταγλωττιστή ή διερµηνευτή σας.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 12

  • EÈÛ·ÁˆÁ‹

    ™ÎÔfi˜

    Σκοπός του κεφαλαίου είναι να µάθει ο σπουδαστής τη δοµή ενός µεταγλωττιστή, τις

    διαδικασίες ανάπτυξής του και να έρθει σε επαφή µε τα εργαλεία που θα χρησιµο-

    ποιήσει για την ανάπτυξή του.

    ¶ÚÔÛ‰ÔÎÒÌÂÓ· ∞ÔÙÂϤÛÌ·Ù·

    Όταν θα έχετε µελετήσει το παρακάτω κεφάλαιο, θα µπορείτε να:

    • αναφέρετε τις δύο βασικές φάσεις που περνά κατά την εκτέλεσή του ένας µετα-

    γλωττιστής,

    • αναφέρετε και να περιγράψετε τα µέρη που αποτελούν τις δύο φάσεις του µετα-

    γλωττιστή,

    • δώσετε παραδείγµατα επτά (7) εργαλείων ανάπτυξης τµηµάτων των µεταγλωττιστών.

    ŒÓÓÔȘ ÎÏÂȉȿ

    1∫ ∂ º ∞ § ∞ π √

    • πηγαία γλώσσα

    • τελική γλώσσα

    • µεταγλωττιστής

    • λεκτικός αναλυτής

    • συντακτικός αναλυτής

    • ενδιάµεσος κώδικας

    • βελτιστοποίηση κώδικα

    ∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ

    Στο κεφάλαιο αυτό θα ασχοληθείτε µε τη δοµή ενός τυπικού µεταγλωττιστή και τα

    εργαλεία που µπορείτε να χρησιµοποιήσετε για την κατασκευή του. Το κεφάλαιο χωρί-

    ζεται σε τρεις ενότητες. Στην πρώτη ενότητα παρουσιάζεται η αιτία ύπαρξης και η

    σηµασία των µεταγλωττιστών. Στη δεύτερη ενότητα παρουσιάζονται αναλυτικά τα

    µέρη ενός µεταγλωττιστή και η διασύνδεση µεταξύ τους. Στην τρίτη ενότητα παρατί-

    θενται τα βασικότερα εργαλεία κατασκευής µεταγλωττιστών.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 13

  • 1 4 K E º A § A I O 1 : E π ™ ∞ ° ø ° ∏

    1.1 EÈÛ·ÁˆÁ‹

    Όταν ακούµε τις φράσεις «Πήρα τον X υπολογιστή», «Έκανα αναβάθµιση στον υπο-

    λογιστή µου», αναφερόµαστε στο µηχάνηµα και εννοούµε τα υλικά µέρη από τα

    οποία έχει αυτό κατασκευαστεί. Από την πλευρά του προγραµµατιστή, όµως, ένας

    υπολογιστής δεν είναι τίποτε παραπάνω από το σύνολο εντολών που προσφέρει το

    υλικό µέρος του υπολογιστή, ώστε αυτός να το προγραµµατίσει για να λύσει ένα

    πλήθος προβληµάτων.

    Για να βοηθηθεί η διαδικασία ανάπτυξης προγραµµάτων και ο έλεγχος των πόρων

    που προσφέρει ένας υπολογιστής, αναπτύχθηκαν τα λειτουργικά συστήµατα, τα οποία

    επέκτειναν το σύνολο εντολών που έχει ο προγραµµατιστής στη διάθεσή του, δηµι-

    ουργώντας µια υποθετική υπολογιστική µηχανή που προγραµµατίζεται ευκολότερα.

    Οι γλώσσες προγραµµατισµού προσφέρουν και αυτές ένα σύνολο εντολών σε ένα

    υψηλότερο επίπεδο. Έτσι, για τον προγραµµατιστή οι γλώσσες προγραµµατισµού

    και το λειτουργικό σύστηµα αποτελούν «φλοιούς» που βρίσκονται ανάµεσα στον

    προγραµµατιστή και το υλικό µε σκοπό τον απλούστερο και αποδοτικότερο προ-

    γραµµατισµό του υλικού.

    Για να µετατραπεί ένα σύνολο εντολών ενός επιπέδου σε σύνολο εντολών ενός χαµη-

    λότερου επιπέδου, απαιτείται η διαδικασία µετάφρασης των εντολών του υψηλότε-

    ρου επιπέδου που λέµε ότι βρίσκεται σε πηγαία λώσσα (source language) σε αυτές

    του χαµηλότερου που ονοµάζεται τελική γλώσσα (object language). Τα προγράµ-

    µατα που αναλαµβάνουν αυτή τη διαδικασία ονοµάζονται µεταγλωττιστές

    (compilers). Συνήθως, για τον ορισµό των µεταγλωττιστών χρησιµοποιούνται γραµ-

    µατικές χωρίς συµφραζόµενα (context free grammars).

    Ανάµεσα στους µεταγλωττιστές και το λειτουργικό σύστηµα υπάρχει υποβοηθητικά

    µια ακόµα υποθετική µηχανή που αποτελείται από δοµές και αλγόριθµους, οι οποί-

    οι δηµιουργούν το υπόβαθρο εκτέλεσης των προγραµµάτων. Αυτή η υποθετική µηχα-

    νή ονοµάζεται «σύστηµα εκτέλεσης» (run–time system) της πηγαίας γλώσσας και

    συνήθως υλοποιείται στην τελική γλώσσα. Ένα σύστηµα εκτέλεσης µπορεί να είναι

    από πολύ απλό, σαν αυτό που συναντάµε στη FORTRAN, µέχρι πολύ περίπλοκο,

    σαν αυτά που συναντάµε σε παράλληλες γλώσσες προγραµµατισµού.

    Στην πράξη, όταν κατασκευάζουµε ένα µεταγλωττιστή, ορίζουµε σηµασιολογικά την

    πηγαία γλώσσα προγραµµατισµού και τις διαδικασίες µετατροπής των συντακτικών

    µορφωµάτων της πηγαίας γλώσσας σε διαδικασίες που θα πρέπει να εκτελέσει η

    υποθετική µηχανή του συστήµατος εκτέλεσης.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 14

  • 1.2 H ‰ÔÌ‹ ÂÓfi˜ ÌÂÙ·ÁψÙÙÈÛÙ‹

    Μια οπτική γωνία από την οποία µπορεί να παρατηρηθεί η λειτουργία ενός µετα-

    γλωττιστή είναι ότι ένας µεταγλωττιστής περνά από τη φάση της ανάλυσης και τη

    φάση της σύνθεσης. Στη φάση της ανάλυσης ο µεταγλωττιστής προσπαθεί να ανα-

    καλύψει τη δοµή του προγράµµατος που έχει σαν είσοδο. Στη φάση της σύνθεσης

    κατασκευάζει το αποτέλεσµα στην τελική γλώσσα, έτσι ώστε αυτό να πραγµατο-

    ποιεί τις διαδικασίες που είχαν προγραµµατιστεί στο πηγαίο πρόγραµµα.

    1 51 . 2 H ¢ √ ª ∏ ∂ ¡ √ ™ ª ∂ ∆∞ ° § ø ∆ ∆ π ™ ∆ ∏

    ΠηγαίοςzKώδικας

    TελικόςzKώδικας

    ΛεκτικόςzAναλυτής

    tokens Συντακτικόz

    ∆ένδρο

    Πίνακαςz

    Συµβόλων

    ΣυντακτικόςzAναλυτής

    ANAΛYΣH

    ΓεννήτοραςzEνδιάµεσουz

    Kώδικα

    Eνδιάµεσοςz

    Kώδικας

    Eνδιάµεσοςz

    Kώδικας

    BελτιστοποιητέςzYψηλού & Mέσουz

    Eπιπέδου

    ΣYNΘEΣH

    ΓεννήτοραςzTελικούzKώδικα

    ΣηµασιολογικόςzAναλυτής

    ™¯‹Ì· 1.1

    Τυπικός

    σχεδιασµός ενός

    µεταγλωττιστή

    Ένας συνήθης µεταγλωττιστής αποτελείται από πολλά τµήµατα τα οποία µπορούµε

    να θεωρήσουµε ότι εκτελούνται αλληλοδιαδοχικά. Ένα παράδειγµα δοµής ενός µετα-

    γλωττιστή φαίνεται στο Σχήµα 1.1.

    1.2.1 O ÏÂÎÙÈÎfi˜ ·Ó·Ï˘Ù‹˜

    Ο λεκτικός αναλυτής οµαδοποιεί τους χαρακτήρες της εισόδου σε Λεκτικές Μονά-

    δες (tokens). Χρησιµοποιούνται κανονικές εκφράσεις (regular expressions), για να

    οριστούν τα πρότυπα των λεκτικών µονάδων που µπορούν να χρησιµοποιηθούν. Για

    παράδειγµα, θα χρησιµοποιήσουµε την έκφραση

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 15

  • 1 6 K E º A § A I O 1 : E π ™ ∞ ° ø ° ∏

    position := initial + rate * 60;

    την οποία θα χρησιµοποιούµε και για τα παραδείγµατα των υπόλοιπων τµηµάτων

    του µεταγλωττιστή. Ένας τυπικός λεκτικός αναλυτής γι’ αυτή την έκφραση θα ανα-

    γνωρίσει τις λεκτικές µονάδες

    position, initial, rate Ù‡Ô˘ ÚÔÛ‰ÈÔÚÈÛÙ‹ (identifier)

    60 Ù‡Ô˘ ÛÙ·ıÂÚ‹˜

    =, *, + Ù‡Ô˘ Ú¿Í˘

    ; Ù‡Ô˘ ÛÙ›Í˘

    Ο λεκτικός αναλυτής µπορεί να χρησιµοποιηθεί µεταξύ άλλων στην αφαίρεση κενών

    και σχολίων και στη µετατροπή των χαρακτήρων σε κεφαλαία ή µικρά για τις γλώσ-

    σες προγραµµατισµού που δε διακρίνουν κεφαλαία από µικρά.

    1.2.2 O Û˘ÓÙ·ÎÙÈÎfi˜ ·Ó·Ï˘Ù‹˜

    Ο συντακτικός αναλυτής οµαδοποιεί τις λεκτικές µονάδες τις οποίες παράγει ο λεκτι-

    κός αναλυτής σε συντακτικές µονάδες. Το τελικό αποτέλεσµα του συντακτικού ανα-

    λυτή είναι ένα συντακτικό δένδρο (parse tree), το οποίο αντιπροσωπεύει το Πηγαίο

    πρόγραµµα που αποτέλεσε την είσοδο του µεταγλωττιστή. Συνήθως, χρησιµοποι-

    ούµε γραµµατικές χωρίς συµφραζόµενα (context–free grammars), για να ορίσουµε

    ένα συντακτικό αναλυτή. Κατά τη διάρκεια της οµαδοποίησης γίνεται έλεγχος για

    συντακτικά λάθη. Το συντακτικό δένδρο για την έκφραση που είδατε στην υποενό-

    τητα 1.2.1 φαίνεται στο Σχήµα 1.2.

    id1

    :=

    id2

    +

    id3 60

    *

    ™¯‹Ì· 1.2

    Παράδειγµα

    συντακτικού

    δένδρου

    1.2.3 O ÛËÌ·ÛÈÔÏÔÁÈÎfi˜ ·Ó·Ï˘Ù‹˜

    Ο σηµασιολογικός αναλυτής αναλύει το συντακτικό δένδρο χρησιµοποιώντας πλη-

    ροφορία που σχετίζεται µε συµφραζόµενα. Για παράδειγµα, στην έκφραση που χρη-

    σιµοποιούµε ως παράδειγµα µπορεί να ελεγχθεί αν έχει οριστεί το position ή αν το

    rate µπορεί να πολλαπλασιαστεί µε τη σταθερή τύπου ακέραιου 60.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 16

  • Μετά τη φάση της σηµασιολογικής ανάλυσης µπορεί να δηµιουργηθεί ένα εντελώς

    διαφορετικό συντακτικό δένδρο. Για παράδειγµα, µπορεί το rate να είναι τύπου πραγ-

    µατικού αριθµού και να απαιτείται η µετατροπή του ακέραιου σε πραγµατικό αριθ-

    µό, πριν γίνει η πράξη του πολλαπλασιασµού.

    1.2.4 O ÁÂÓÓ‹ÙÔÚ·˜ ÂӉȿÌÂÛÔ˘ ÎÒ‰Èη

    Ο γεννήτορας ενδιάµεσου κώδικα παίρνει ως είσοδο το συντακτικό δένδρο και παρά-

    γει κώδικα για µια απλή υποθετική µηχανή. Συνήθης τέτοια αναπαράσταση είναι ο

    «κώδικας τριών διευθύνσεων», όπου κάθε εντολή έχει το πολύ τρεις τελεστές. Για

    την έκφραση που χρησιµοποιούµε για παράδειγµα θα έχουµε

    temp1 := inttoreal(60)

    temp2 := id3 * temp1

    temp3 := id2 + temp2

    id1 := temp3

    Η ύπαρξη ενδιάµεσου κώδικα έχει πολλαπλά πλεονεκτήµατα. Αν θέλουµε να µετα-

    φέρουµε το µεταγλωττιστή σε µια διαφορετική υπολογιστική αρχιτεκτονική, αρκεί

    µόνο να κατασκευαστεί ο µεταφραστής από την ενδιάµεση µορφή στην τελική γλώσ-

    σα. Αντίστοιχα, αν θέλουµε να φτιάξουµε µεταγλωττιστή για µια καινούρια γλώσ-

    σα, αν το ρεπερτόριο εντολών που παρέχει ο ενδιάµεσος κώδικας επαρκεί, µπορού-

    µε να κατασκευάσουµε µόνο τη φάση της ανάλυσης γι’ αυτή τη γλώσσα και να παρά-

    γουµε ενδιάµεσο κώδικα.

    1.2.5 OÈ ‚ÂÏÙÈÛÙÔÔÈËÙ¤˜ ˘„ËÏÔ‡ Î·È ÌÂÛ·›Ô˘ ÂȤ‰Ô˘

    Οι βελτιστοποιητές υψηλού και µεσαίου επιπέδου είναι δυνατόν να περιλαµβάνουν

    πολλές αλληλοδιαδεχόµενες διαδικασίες. Η λειτουργία των διαδικασιών που περι-

    λαµβάνουν βασίζεται πάνω σε αλγόριθµους και τεχνικές που έχουν σαν στόχο να

    βελτιώσουν το συντακτικό δένδρο, ώστε να µπορεί να παραχθεί «καλύτερος» τελι-

    κός κώδικας. Η έννοια του «καλύτερου» κώδικα είναι αρκετά περίπλοκη και σχετί-

    ζεται µε το ζητούµενο αποτέλεσµα. Τυπικά ζητούµενα στη διαδικασία βελτιστοποί-

    ησης είναι ο πιο γρήγορα εκτελούµενος τελικός κώδικας, η χρησιµοποίηση µικρό-

    τερης µνήµης και η ορθολογικότερη εκµετάλλευση των πόρων του υπολογιστή. Για

    παράδειγµα, αν εφαρµόζαµε βελτιστοποίηση, ο ενδιάµεσος κώδικας της έκφρασης

    που χρησιµοποιούµε ως παράδειγµα θα µπορούσε να µετατραπεί σε

    temp1 := id3 * 60.0

    id1 := id2 + temp1

    1 71 . 2 H ¢ √ ª ∏ ∂ ¡ √ ™ ª ∂ ∆∞ ° § ø ∆ ∆ π ™ ∆ ∏

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 17

  • 1 8 K E º A § A I O 1 : E π ™ ∞ ° ø ° ∏

    Aυτό είναι το πιο χρονοβόρο και περίπλοκο τµήµα ενός µεταγλωττιστή. Οι βελτι-

    στοποιητές είναι προαιρετικά συστατικά των µεταγλωττιστών, αλλά ένας «καλός»

    µεταγλωττιστής απαραίτητα περιέχει βελτιστοποιητές.

    1.2.6 O ÁÂÓÓ‹ÙÔÚ·˜ ÙÂÏÈÎÔ‡ ÎÒ‰Èη

    Ο γεννήτορας τελικού κώδικα δέχεται ως είσοδο το συντακτικό δένδρο ή τον ενδιά-

    µεσο κώδικα και παράγει ως έξοδο τον τελικό κώδικα. Σε κάποιες περιπτώσεις Μετα-

    γλωττιστών δεν παράγεται κώδικας που µπορεί να εκτελεστεί απευθείας από τον επε-

    ξεργαστή, αλλά κώδικας assembly.

    Κατά τη διαδικασία της παραγωγής του τελικού κώδικα πραγµατοποιείται ανάθεση

    των µεταβλητών στις αντίστοιχες θέσεις µνήµης, γίνεται επιλογή των εντολών χαµη-

    λού επιπέδου και υλοποιείται η πολιτική ανάθεσης των µεταβλητών στους καταχω-

    ρητές του επεξεργαστή.

    1.2.7 O ‚ÂÏÙÈÛÙÔÔÈËÙ‹˜ ¯·ÌËÏÔ‡ ÂȤ‰Ô˘

    Οι αλγόριθµοι και οι τεχνικές που εκτελούνται κατά τη λειτουργία ενός βελτιστο-

    ποιητή χαµηλού επιπέδου αναφέρονται στον τελικό κώδικα. Αξιοποιούν πληροφο-

    ρίες που σχετίζονται µε τις ιδιοµορφίες της υπολογιστικής αρχιτεκτονικής, στην

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

    1.2.8 O ›Ó·Î·˜ Û˘Ì‚fiψÓ

    Ο πίνακας συµβόλων είναι το βασικότερο τµήµα ενός µεταγλωττιστή. Υποβοηθά

    όλα τα υπόλοιπα τµήµατά του παρέχοντας τις δοµές που απαιτούνται, για να τοπο-

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

    λα του πηγαίου προγράµµατος και λειτουργεί ως µέσο επικοινωνίας των διάφορων

    τµηµάτων του µεταγλωττιστή.

    Μια τυπική εγγραφή στον πίνακα συµβόλων µιας µεταβλητής περιέχει τη διεύθυνση

    µνήµης, τον τύπο και την εµβέλειά της. Αν πρόκειται για συνάρτηση, θα περιέχει επι-

    πρόσθετα µεταξύ άλλων το όνοµά της, τον αριθµό και τον τύπο των ορισµάτων της.

    Σε πολύ απλούς µεταγλωττιστές ορισµένα τµήµατα ενοποιούνται ή δεν υλοποιούνται

    καθόλου. Είναι συνηθισµένη η ενοποίηση του συντακτικού αναλυτή µε το σηµασιο-

    λογικό αναλυτή και το γεννήτορα τελικού κώδικα. Στις διαδικασίες που εκτελεί ο

    συντακτικός αναλυτής προστίθενται απλές διαδικασίες σηµασιολογικής ανάλυσης

    και στη συνέχεια παράγεται ο τελικός κώδικας. Στην περίπτωση αυτή δε δηµιουργεί-

    ται συντακτικό δένδρο, αλλά παράγεται απευθείας ο αντίστοιχος τελικός κώδικας.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 18

  • 1.3 EÚÁ·Ï›· ·Ó¿Ù˘Í˘ ÌÂÙ·ÁψÙÙÈÛÙÒÓ

    Επειδή η διαδικασία κατασκευής ενός µεταγλωττιστή είναι µια επίπονη διαδικασία,

    της οποίας, όµως, ένα µέρος µπορεί να αυτοµατοποιηθεί, η επιστηµονική κοινότη-

    τα που ασχολήθηκε µε την κατασκευή µεταγλωττιστών από πολύ νωρίς ανέπτυξε

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

    εργαλεία για την εξοµοίωση υπολογιστικών αρχιτεκτονικών, ώστε να µπορεί να ελεγ-

    χθεί ο παραγόµενος τελικός κώδικας και να εκτιµηθεί η βελτίωση που προσφέρουν

    οι διάφορες φάσεις βελτιστοποίησης.

    1.3.1 T· Lex & Flex

    Τα πιο συνηθισµένα εργαλεία κατασκευής λεκτικών αναλυτών είναι τα lex και flex. To

    lex µετατρέπει την είσοδό του, που την αποτελούν κανόνες αναγνώρισης προτύπων και

    βοηθητικές συναρτήσεις, σε ένα λεκτικό αναλυτή. Το flex είναι µια βελτιωµένη υλο-

    ποίηση του lex, η οποία προσφέρεται δωρεάν από το Free Software Foundation. Μπο-

    ρείτε να το βρείτε πολύ εύκολα στο Internet (π.χ. ftp://ftp.ntua.gr/pub/gnu/flex/). Είναι

    στο µεγαλύτερο ποσοστό του συµβατό µε το lex µε µόνο κάποιες µικρές διαφορές που

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

    1.3.2 TA Yacc & Bison

    Τα πιο συνηθισµένα εργαλεία κατασκευής συντακτικών αναλυτών είναι τα yacc και

    bison. Το yacc µετατρέπει την είσοδό του, που την αποτελούν συντακτικοί κανόνες

    και βοηθητικές συναρτήσεις, σε ένα συντακτικό αναλυτή. Το bison είναι διαφορετι-

    κή υλοποίηση του yacc που προσφέρεται δωρεάν (π.χ. ftp://ftp.ntua.gr/pub/gnu/bison/)

    1 91 . 3 E ƒ °∞ § ∂ π ∞ ∞ ¡ ∞ ¶ ∆ À • ∏ ™ ª ∂ ∆∞ ° § ø ∆ ∆ π ™ ∆ ø ¡

    ÕÛÎËÛË ∞˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 1.1

    Κρίνετε αν οι παρακάτω προτάσεις είναι σωστές ή λανθασµένες..

    Σωστό Λάθος

    α) Η λειτουργία ενός µεταγλωττιστή υλοποιείται σε δύο φάσεις. ❏ ❏

    β) Για να εκτελεστεί ένας µεταγλωττιστής σε έναν υπολογιστή,

    απαιτείται η ύπαρξη του συστήµατος εκτέλεσης

    της πηγαίας γλώσσας στον υπολογιστή αυτό. ❏ ❏

    γ) Όλα τα τµήµατα ενός µεταγλωττιστή, όπως παρουσιάζονται

    στο Σχήµα 1.1, πρέπει να υλοποιηθούν. ❏ ❏

    δ) Υπάρχουν τρία επίπεδα στα οποία µπορεί να εφαρµοστεί

    βελτιστοποίηση του κώδικα από ένα µεταγλωττιστή. ❏ ❏

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 19

  • 2 0 K E º A § A I O 1 : E π ™ ∞ ° ø ° ∏

    από το Free Software Foundation, αντίστοιχα µε το flex. Απαιτούν και τα δύο την

    ύπαρξη λεκτικού αναλυτή και συνεργάζονται άριστα µε τους λεκτικούς αναλυτές που

    παράγουν τα lex και flex.

    1.3.3 TÔ PCCTS

    Τα αρχικά PCCTS σηµαίνουν Purdue Compiler Construction Tool Set το οποίο, όπως

    λέει το όνοµά του, είναι ένα σύνολο εργαλείων για την κατασκευή µεταγλωττιστών.

    Αποτελείται από το ANLTR που είναι αντίστοιχο του yacc, το DLG που είναι αντί-

    στοιχο του lex και από βοηθητικό κώδικα. Η ουσιαστική διαφορά µε το yacc είναι

    ότι το PCCTS µπορεί να περιγράψει LL(k) γραµµατικές. Άλλη διαφορά είναι ότι το

    αρχείο περιγραφής του Λεκτικού αναλυτή που αποτελεί είσοδο του DLG παράγεται

    αυτόµατα από το ANLTR. Τέλος, παρέχεται έτοιµος µηχανισµός για την παραγωγή

    του συντακτικού δένδρου.

    1.3.4 TÔ Spim

    Το spim εξοµοιώνει τον επεξεργαστή MIPS R2000/3000. Μπορεί να εκτελέσει απευ-

    θείας κώδικα assembly για τον επεξεργαστή. Παρέχει εργαλεία για την εκσφαλµάτωση

    του κώδικα και δυνατότητα επικοινωνίας µε άλλα προγράµµατα και το λειτουργικό

    σύστηµα του υπολογιστή. Λειτουργεί στην πλειοψηφία των υπολογιστικών αρχιτεκτο-

    νικών και είναι ένα πολύ καλό σύστηµα που µπορεί να χρησιµοποιηθεί κατά τη διάρκεια

    της εκµάθησης κατασκευής µεταγλωττιστών. Κατασκευάστηκε από τον James Larus,

    που δούλευε στο πανεπιστήµιο του Wisconsin και τώρα συνεργάζεται µε την Microsoft.

    1.3.5 To Warts

    To WARTS βοηθάει στην εξοµοίωση της συµπεριφοράς της λανθάνουσας µνήµης

    πραγµατικών υπολογιστικών αρχιτεκτονικών. Κατασκευάστηκε και αυτό από τον

    James Larus.

    ÕÛÎËÛË ∞˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 1.2

    Κρίνετε αν οι παρακάτω προτάσεις είναι σωστές ή λανθασµένες.

    Σωστό Λάθος

    α) Το lex είναι ένας λεκτικός αναλυτής ❏ ❏

    β) Το yacc είναι εργαλείο κατασκευής συντακτικών αναλυτών. ❏ ❏

    γ) Το spim µπορεί να χρησιµοποιηθεί µόνο σε υπολογιστές

    που έχουν επεξεργαστή της οικογένειας MIPS. ❏ ❏

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 20

  • 2 11 . 3 E ƒ °∞ § ∂ π ∞ ∞ ¡ ∞ ¶ ∆ À • ∏ ™ ª ∂ ∆∞ ° § ø ∆ ∆ π ™ ∆ ø ¡

    ÕÛÎËÛË ∞˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 1.3

    Προσπαθήστε να συσχετίσετε τα κοµµάτια του µεταγλωττιστή µε τις αντίστοιχες

    έννοιες. Είναι δυνατόν να µην υπάρχει συσχέτιση ή να υπάρχει πολλαπλή συσχέ-

    τιση ανάµεσα στα στοιχεία των δύο στηλών.

    λεκτική µονάδα

    λεκτικός αναλυτής συντακτικό δένδρο

    συντακτικός αναλυτής κανονική έκφραση

    γενν. ενδιάµεσης µορφής πίνακας συµβόλων

    γενν. τελικού κώδικα PCCTS

    σηµασιολογκός αναλυτής bison

    spim

    ¢Ú·ÛÙËÚÈfiÙËÙ· 1.1

    Πηγαίνετε στη βιβλιοθήκη και βρείτε βιβλία για µεταγλωττιστές. Επιλέξτε δύο από

    αυτά και µε βάση τα περιεχόµενα και την εισαγωγή τους κάνετε µια σύγκριση της

    ύλης που καλύπτουν. Αν είναι παλιές εκδόσεις, βρείτε και σηµειώστε πόσο διαφο-

    ρετικά είναι τα εργαλεία και οι τεχνικές που προτείνονται.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 21

  • 2 2 K E º A § A I O 1 : E π ™ ∞ ° ø ° ∏

    ™‡ÓÔ„Ë

    Στο Kεφάλαιο 1 µάθατε ότι ένας µεταγλωττιστής υλοποιείται σε δύο φάσεις και απο-

    τελείται από πολλά τµήµατα, τα οποία εκτελούνται αλληλοδιαδοχικά. Το σηµαντικό-

    τερο τµήµα ενός µεταγλωττιστή είναι ο πίνακας συµβόλων που λειτουργεί σαν βάση

    δεδοµένων και µέσο επικοινωνίας ανάµεσα στα τµήµατα του µεταγλωττιστή.

    Η φάση της ανάλυσης υλοποιείται από τρία τµήµατα. Από το λεκτικό αναλυτή που

    µετατρέπει την είσοδο του µεταγλωττιστή σε λεκτικές µονάδες, το συντακτικό αναλυ-

    τή που οµαδοποιεί τις λεκτικές µονάδες σε συντακτικές µονάδες και το σηµασιολο-

    γικό αναλυτή που, χρησιµοποιώντας σηµασιολογική πληροφορία, ελέγχει και βελ-

    τιώνει το συντακτικό δένδρο.

    Η φάση της σύνθεσης υλοποιείται από πέντε µέρη. Από το γεννήτορα ενδιάµεσου κώδι-

    κα που παράγει ενδιάµεσο κώδικα χρησιµοποιώντας ως είσοδο το συντακτικό δένδρο.

    Τους βελτιστοποιητές υψηλού και µεσαίου επιπέδου που χρησιµοποιούν σαν είσοδο

    τον ενδιάµεσο κώδικα και έχουν σαν στόχο την ποιοτική αναβάθµισή του και το γεν-

    νήτορα τελικού κώδικα που παράγει τον τελικό κώδικα. Τέλος, µπορεί να υπάρχει ο

    βελτιστοποιητής χαµηλού επιπέδου που βελτιώνει τον τελικό κώδικα χρησιµοποιώ-

    ντας πληροφορίες για τις ιδιοµορφίες της µηχανής στην οποία αυτός θα εκτελεστεί.

    Υπάρχουν πολλά εργαλεία που µπορούν να βοηθήσουν τη διαδικασία κατασκευής

    ενός µεταγλωττιστή. Είδατε τα κλασικά εργαλεία lex και yacc και τις ελεύθερα χρη-

    σιµοποιούµενες υλοποιήσεις τους, flex και bison, που βοηθούν στην κατασκευή λεκτι-

    κών και συντακτικών αναλυτών και το PCCTS που µπορεί να τα αντικαταστήσει.

    Ακόµα, παρουσιάστηκε το spim που εξοµοιώνει έναν πραγµατικό επεξεργαστή και

    µπορεί να χρησιµοποιηθεί σαν πλατφόρµα εκτέλεσης του δηµιουργούµενου τελικού

    κώδικα και το warts που βοηθάει στη µέτρηση της απόδοσης του τελικού κώδικα ως

    προς την προσπέλαση της λανθάνουσας µνήµης.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 22

  • 2∫ ∂ º ∞ § ∞ π √O °ÂÓÓ‹ÙÔÚ·˜ §ÂÎÙÈÎÒÓ AÓ·Ï˘ÙÒÓ Lex™ÎÔfi˜Σκοπός του κεφαλαίου είναι να µάθετε πώς µπορείτε να περιγράψετε τις λεκτικές

    µονάδες (tokens) µιας γλώσσας και πώς µπορείτε να κατασκευάσετε ένα πρόγραµµα

    (λεκτικό αναλυτή), το οποίο θα αναγνωρίζει λεκτικές µονάδες από την είσοδό του.

    Για να επιτύχετε αυτό το σκοπό, θα µάθετε να χρησιµοποιείτε το πλέον χρησιµοποι-

    ούµενο εργαλείο κατασκευής λεκτικών αναλυτών, το lex.

    ¶ÚÔÛ‰ÔÎÒÌÂÓ· ·ÔÙÂϤÛÌ·Ù·

    Όταν θα έχετε µελετήσει το παρακάτω κεφάλαιο, θα µπορείτε να:

    • περιγράφετε τις αρχές λειτουργίας ενός λεκτικού αναλυτή,

    • ορίζετε κανονικές εκφράσεις (Regular Expressions) για τις λεκτικές µονάδες διά-

    φορων γλωσσών προγραµµατισµού,

    • χρησιµοποιείτε το εργαλείο κατασκευής λεκτικών αναλυτών lex, όταν χρειασθεί

    να κατασκευάσετε ένα λεκτικό αναλυτή.

    ŒÓÓÔȘ ÎÏÂȉȿ

    • λεκτικός αναλυτής

    • λεκτική µονάδα (token)

    • κανονικές εκφράσεις

    • κανόνες αναγνώρισης προτύπων

    • ταύτιση κανονικών εκφράσεων

    • δράσεις κανόνων

    • αρχικές καταστάσεις

    ∂ÈÛ·ÁˆÁÈΤ˜ ·Ú·ÙËÚ‹ÛÂȘ

    Το lex είναι το ευρύτερα χρησιµοποιούµενο εργαλείο για την κατασκευή λεκτικών ανα-

    λυτών. Αυτό το κεφάλαιο προσπαθεί να παρουσιάσει τον τρόπο που µπορεί να υλο-

    ποιηθεί ένας λεκτικός αναλυτής κάνοντας χρήση του lex. Θα µάθετε να γράφετε προ-

    διαγραφές για λεκτικές µονάδες τις οποίες θα χρησιµοποιήσει το lex για την κατασκευή

    ενός λεκτικού αναλυτή. Θα γνωρίσετε τις δοµές και συναρτήσεις που προσφέρει το lex

    και τον τρόπο διασύνδεσής του µε το γεννήτορα συντακτικών αναλυτών yacc.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 23

  • 2 4 K E º A § A I O 2 : O ° ∂ ¡ ¡ ∏ ∆ √ ƒ∞ ™ § ∂ ∫ ∆ π ∫ ø ¡ A ¡ ∞ § À ∆ ø ¡ L E X

    2.1 EÈÛ·ÁˆÁ‹

    Όταν αναφερόµαστε σε µια γλώσσα, π.χ. την Ελληνική γλώσσα, ορισµένες ακο-

    λουθίες γραµµάτων µπορούν να οµαδοποιηθούν δηµιουργώντας λέξεις και να ανα-

    γνωριστούν ως συγκεκριµένοι τύποι λέξεων, π.χ. ρήµατα. Ακολουθώντας αντίστοι-

    χη λογική, όταν ορίζουµε µια γλώσσα προγραµµατισµού, ορίζουµε γενικούς τύπους

    ακολουθιών γραµµάτων που έχουν συγκεκριµένη σηµασία στη γλώσσα που δηµι-

    ουργούµε. Τη διαδικασία της αναγνώρισης µιας ακολουθίας γραµµάτων και της αντι-

    στοίχησής της σε µια κατηγορία τύπων ονοµάζουµε λεκτική ανάλυση.

    Μπορούµε να κατασκευάσουµε προγράµµατα που να εκτελούν τη διαδικασία της

    Λεκτικής Ανάλυσης. Τα προγράµµατα αυτά στη βιβλιογραφία ονοµάζονται Λεκτι-

    κοί Αναλυτές (Λ.Α.). Η βασική λειτουργία ενός τυπικού Λ.Α. είναι να διαβάζει από

    την είσοδό του έναν–έναν τους χαρακτήρες της εισόδου, να αναγνωρίζει ακολουθίες

    χαρακτήρων και να παράγει στην έξοδό του Λεκτικές Μονάδες (tokens). Ως παρά-

    δειγµα, η ακολουθία των παρακάτω γραµµάτων

    area = length * height + 20;

    µπορεί να µετασχηµατιστεί από ένα Λ.Α. σε µια ακολουθία από τις Λεκτικές Μονάδες

    area, length, height τύπου προσδιοριστή (identifier)

    20 τύπου σταθερής

    =, *, + τύπου πράξης

    ; τύπου στίξης

    Όταν θέλουµε να κατασκευάσουµε ένα Λ.Α., θα πρέπει να τον προγραµµατίσουµε

    µε τέτοιο τρόπο, ώστε να µπορεί να κατηγοριοποιήσει τις ακολουθίες γραµµάτων

    στους διάφορους τύπους. Για να επιτευχθεί αυτό, πρέπει να ορίσουµε κανόνες που

    θα πρέπει να ακολουθούνται κατά τη διάρκεια της αναγνώρισης.

    Υπάρχει τυπικός τρόπος για τον ορισµό κανόνων που θα χρησιµοποιηθούν για την

    αναγνώριση πρότυπων χαρακτήρων. Οι κανόνες αυτοί ονοµάζονται Κανονικές

    Εκφράσεις (Regular Expressions). Με τη βοήθειά τους µπορούµε να ορίσουµε τις

    ακολουθίες χαρακτήρων που ανήκουν στη γλώσσα, δηλαδή τις Λεκτικές Μονάδες

    τις οποίες θέλουµε να αναγνωρίζει ο Λ.Α.

    Για να βοηθηθεί η κατασκευή Λεκτικών Αναλυτών υπάρχει ένα εργαλείο κατασκευής

    τους. Το εργαλείο αυτό ονοµάζεται lex και είναι και αυτό ένας µεταφραστής. Το lex

    µετατρέπει την είσοδό του, που την αποτελούν Κανόνες Αναγνώρισης Προτύπων

    και βοηθητικές συναρτήσεις, σε ένα λεκτικό αναλυτή που µπορεί να χρησιµοποιη-

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 24

  • θεί είτε αυτόνοµα είτε σε συνδυασµό µε ένα Συντακτικό αναλυτή για την κατασκευή

    ενός µεταγλωττιστή. Θα είναι χρήσιµο να µελετήσετε ξανά το αντίστοιχο κεφάλαιο

    της Θεµατικής Υποενότητας 6.1 «Μεταγλωττιστές», για να ξαναθυµηθείτε λίγα

    πράγµατα από τη θεωρία και τη γενική λειτουργία του lex.

    2.2 ¶ÚÔÁÚ·ÌÌ·Ù›˙ÔÓÙ·˜ ÌÂ ÙÔ Lex

    Γενικά, η µορφή του πηγαίου κώδικα που µπορεί να αναγνωρίσει το lex είναι η εξής:

    {ÔÚÈÛÌÔ›}

    %%

    {ηÓfiÓ˜ (rules)}

    %%

    {ÕÏϘ ˘ÏÔÔÈ‹ÛÂȘ Û˘Ó·ÚÙ‹ÛˆÓ}

    Το τµήµα πριν από το πρώτο %% και µετά το τέλος των κανόνων µπορεί να παρα-

    λειφθεί, αν δεν είναι απαραίτητο. Έτσι, το πιο µικρό σωστό πρόγραµµα σε lex είναι

    %%

    το οποίο αντιστοιχεί σε προδιαγραφές για ένα Λ.Α., ο οποίος εκτελεί µόνο την προ-

    διαγεγραµµένη ∆ράση της αντιγραφής της εισόδου στην έξοδο.

    Οι κανόνες στο lex έχουν τη γενική µορφή

    ‰Ú¿ÛË

    και αντιπροσωπεύουν έναν Πίνακα µε τις ∆ράσεις που πρέπει να εκτελέσει ο Λ.Α.

    σε κάθε περίπτωση που θα αναγνωρίσει το αντίστοιχο πρότυπο στην είσοδό του. Για

    παράδειγµα, ο κανόνας

    integer { printf(“found keyword INT”); }

    σε περίπτωση που βρεί τη λέξη integer στην είσοδο του Λ.Α., θα τυπώσει το µήνυµα

    ``found keyword INT’’.

    2.3 °Ú¿ÊÔÓÙ·˜ ηÓfiÓ˜ ÛÙÔ Lex

    Παραπάνω αναφέραµε ότι τα πρότυπα στο lex ορίζονται µε Κανονικές Εκφράσεις,

    οι οποίες ορίζουν την ακολουθία γραµµάτων που θα ταυτιστεί. Στη συνέχεια, θα

    εκτελεστεί η αντίστοιχη ∆ράση. Οι Κανονικές Εκφράσεις στο lex, εκτός από απλές

    αλφαριθµητικές ακολουθίες, περιλαµβάνουν και χαρακτήρες τελεστών µε διάφορες

    σηµασίες, όπως επανάληψη, επιλογή κ.ά. που θα δούµε παρακάτω.

    2 52 . 3 ° ƒ à º ¶ ª ∆∞ ™ ∫ ∞ ¡ √ ¡ ∂ ™ ™ ∆ √ L E X

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 25

  • 2 6 K E º A § A I O 2 : O ° ∂ ¡ ¡ ∏ ∆ √ ƒ∞ ™ § ∂ ∫ ∆ π ∫ ø ¡ A ¡ ∞ § À ∆ ø ¡ L E X

    Οι χαρακτήρες τελεστών είναι οι ακόλουθοι:

    “ \ [ ] ^ - ? . * + | ( ) $ / { } % < >

    και σε περίπτωση που θέλουµε να τους χρησιµοποιήσουµε σαν απλούς χαρακτήρες,

    θα πρέπει να προηγείται ο χαρακτήρας διαφυγής, που στο συνήθη συνδυασµό χρήσης

    του lex µε τη γλώσσα προγραµµατισµού C είναι ο \. Ο χαρακτήρας (“) ορίζει την αρχή

    ή το τέλος µιας ακολουθίας χαρακτήρων. Για παράδειγµα, τα πρότυπα των xyz“+“ ,

    “xyz+“ , xyz\+ αντιστοιχούν στην ακολουθία χαρακτήρων xyz+, σε αντίθεση µε

    το πρότυπο xyz+, που, όπως θα δείτε παρακάτω στην υποενότητα 2.3.3, αντιστοιχεί

    σε κάτι διαφορετικό. Είναι, λοιπόν, καλή πρακτική να βάζετε µέσα σε ζευγάρι διπλών

    εισαγωγικών (“ “) κάθε άλλο µη αλφαριθµητικό χαρακτήρα που θέλετε να δηλώσε-

    τε ως χαρακτήρα. Μια ακόµα χρήση των (“) είναι όταν θέλουµε να περιγράψουµε πρό-

    τυπο που περιέχει τον κενό χαρακτήρα ή τον οριζόντιο στηλογνώµονα (tab), τα οποία

    κανονικά στο lex χωρίζουν τις Λεκτικές Μονάδες. Μέσα σε ζευγάρι διπλών εισαγω-

    γικών (“ “) µπορούν να χρησιµοποιηθούν και οι συµβολισµοί της C για ειδικούς χαρα-

    κτήρες, π.χ. καινούρια γραµµή \n, οριζόντιος στηλογνώµονας \t, πισωγύρισµα \b.

    2.3.1 KÏ¿ÛÂȘ ¯·Ú·ÎÙ‹ÚˆÓ

    Όταν θέλουµε να ορίσουµε ένα πρότυπο που µπορεί να ταυτιστεί µε έναν από τους

    χαρακτήρες µιας οµάδας χαρακτήρων, τότε ορίζουµε µία κλάση χαρακτήρων. Μία

    κλάση χαρακτήρων ορίζεται από χαρακτήρες που περικλείονται µέσα σε ένα συν-

    δυασµό αριστερής και δεξιάς αγκύλης. Έτσι, η συµβολοσειρά [abc] µπορεί να ταυ-

    τιστεί µε το χαρακτήρα a ή µε το χαρακτήρα b ή µε το χαρακτήρα c.

    Όλοι οι χαρακτήρες µέσα στα [ ] αντιπροσωπεύουν ένα µοναδικό χαρακτήρα εκτός

    από τους \, - και ^. O χαρακτήρας – σηµαίνει διάστηµα χαρακτήρων. Ως παρά-

    δειγµα, το [A-Za-z0-9

  • 2.3.2 ¶ÚÔ·ÈÚÂÙÈΤ˜ ÂÎÊÚ¿ÛÂȘ

    Ο τελεστής ? σηµαίνει ότι το σύµβολο που προηγείται είναι προαιρετικό σε µια

    έκφραση. Έτσι, το πρότυπο ab?c µπορεί να ταυτιστεί είτε µε το ac είτε µε το abc.

    2.3.3 E·Ó·ÏËÙÈΤ˜ ÂÎÊÚ¿ÛÂȘ

    Μπορούµε µε τη βοήθεια των χαρακτήρων * και + να ορίσουµε πρότυπα που να ταυ-

    τίζονται µε 0 ή περισσότερες και 1 ή περισσότερες εµφανίσεις των αντίστοιχων

    εκφράσεων που προηγούνται. Για παράδειγµα, το a* σηµαίνει κανένα ή περισσότε-

    ρα a, ενώ το a+ σηµαίνει τουλάχιστον ένα ή περισσότερα a. Αντίστοιχα, το πρότυ-

    πο [a-z]+ σηµαίνει όλες τις συµβολοσειρές που αποτελούνται από µικρά γράµ-

    µατα και το πρότυπο [A-Za-z][A-Za-z0-9]* σηµαίνει όλες τις αλφαριθµητικές

    συµβολοσειρές που αρχίζουν µε αλφαριθµητικό χαρακτήρα. Το δεύτερο πρότυπο

    χρησιµοποιείται συνήθως στις περισσότερες γλώσσες προγραµµατισµού για τον ορι-

    σµό των µεταβλητών.

    2.3.4 EÎÊÚ¿ÛÂȘ ÂÓ·ÏÏ·Á‹˜

    Ο τελεστής | ορίζει την έννοια της εναλλαγής, δηλαδή τη δυνατότητα να ταυτιστεί

    ένα πρότυπο µε έναν από τους δύο όρους που το αποτελούν. Ως παράδειγµα, το πρό-

    τυπο ab|cd µπορεί να ταυτιστεί είτε µε το ab είτε µε το cd.

    2.3.5 EÎÊÚ¿ÛÂȘ ÔÌ·‰ÔÔ›ËÛ˘

    Οι παρενθέσεις είναι το µέσο που χρησιµοποιούµε για να εκφράσουµε οµαδοποίηση

    στο lex. Οι παρενθέσεις, αν και δεν είναι λάθος να χρησιµοποιούνται και στο εξωτερι-

    κό επίπεδο µιας Κανονικής Έκφρασης του lex, δεν είναι απαραίτητες. Έτσι στο lex οι

    εκφράσεις (abc) και abc ταυτίζονται, αν βρίσκονται στο εξωτερικό επίπεδο µιας Κανο-

    νικής Έκφρασης. Οι παρενθέσεις χρησιµοποιούνται, για να περιγράψουµε πολύπλοκες

    εκφράσεις. Για παράδειγµα, η έκφραση (ab|cd+)?(ef)* ταυτίζεται µε ακολουθίες

    χαρακτήρων, όπως abefef , efefef , cdef ή cddd αλλά όχι και µε abc , abcd ή abcdef.

    2 72 . 3 ° ƒ à º ¶ ª ∆∞ ™ ∫ ∞ ¡ √ ¡ ∂ ™ ™ ∆ √ L E X

    ÕÛÎËÛË ∞˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.1

    Όταν χρησιµοποιούµε το lex και θέλουµε να αναγνωρίσουµε ένα σύνολο χαρα-

    κτήρων, τοποθετούµε τους χαρακτήρες µέσα σε [ και ], χωρίς να έχει σηµασία η

    σειρά εµφάνισης των χαρακτήρων. Όταν, όµως, θέλουµε να συµπεριλάβουµε στο

    σύνολο το χαρακτήρα “]”, αυτός πρέπει να είναι πρώτος στο σύνολο, ενώ και ο

    χαρακτήρας “-” πρέπει να είναι πρώτος ή τελευταίος. Μπορείτε να βρείτε γιατί;

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 27

  • 2 8 K E º A § A I O 2 : O ° ∂ ¡ ¡ ∏ ∆ √ ƒ∞ ™ § ∂ ∫ ∆ π ∫ ø ¡ A ¡ ∞ § À ∆ ø ¡ L E X

    2.3.6 E˘·ÈÛıËÛ›· Û˘ÌÊÚ·˙Ô̤ӈÓ

    Το lex έχει τη δυνατότητα να αναγνωρίζει και κάποιες απλές περιπτώσεις συµφρα-

    ζόµενων, αν και αυτό είναι βασική δουλειά του Συντακτικού Αναλυτή. Οι δύο απλού-

    στερες τέτοιες µορφές είναι οι τελεστές ^ και $.

    Αν ο τελεστής ^ είναι ο πρώτος χαρακτήρας σε µία έκφραση, τότε αυτή η έκφραση

    µπορεί να ταυτιστεί µόνο αν βρίσκεται στην αρχή µιας γραµµής. Θυµηθείτε ότι το

    lex σαν αρχή γραµµής ορίζει τους χαρακτήρες που ακολουθούν το χαρακτήρα και-

    νούριας γραµµής ( \n ) και την αρχή ενός αρχείου εισόδου. Για να µην υποπέσετε

    σε λάθη, όταν γράφετε εκφράσεις στο lex, θυµηθείτε τη διαφορετική ερµηνεία του

    τελεστή ^ µέσα στις κλάσεις χαρακτήρων.

    Αν ο τελεστής $ είναι ο τελευταίος χαρακτήρας σε µια έκφραση, τότε αυτή η έκφρα-

    ση µπορεί να ταυτιστεί µόνο αν βρίσκεται στο τέλος µιας γραµµής, δηλαδή όταν

    αυτή ακολουθείται από το χαρακτήρα καινούριας γραµµής ( \n ).

    Ο τελεστής $ είναι απλά µια ειδική περίπτωση του τελεστή /, ο οποίος ορίζει ακο-

    λουθούµενα συµφραζόµενα. Για παράδειγµα, η έκφραση ab/cd µπορεί να ταυτιστεί

    µε το ab, αλλά µόνο όταν αυτό ακολουθείται από το cd. Έτσι, το ab$ είναι το ίδιο

    µε το ab/\n.

    Μπορούµε ακόµα να ορίσουµε στο lex ευαισθησία προς τα συµφραζόµενα που βρί-

    σκονται «αριστερά» (ουσιαστικά πριν, αλλά για ιστορικούς λόγους υπάρχει η έννοια

    του left context ) από το σηµείο που βρίσκεται το αρχείο εισόδου µε τη χρήση αρχι-

    κών συνθηκών, τις οποίες θα δούµε στην ενότητα 2.7.

    2.3.7 E·Ó¿ÏË„Ë Î·È ¯Ú‹ÛË ÔÚÈÛÌÒÓ

    Το ζευγάρι των τελεστών {} έχει διπλή χρήση και µπορεί να σηµαίνει είτε χρήση

    ορισµών (όταν περικλείουν ακολουθία χαρακτήρων) είτε επανάληψη (όταν περι-

    κλείουν αριθµούς).

    Όταν αναφερόµαστε σε χρήση ορισµών, εννοούµε οι λέξεις που έχουµε ορίσει να

    αντιστοιχούν σε µια Κανονική Έκφραση στο πρώτο κοµµάτι του αρχείου εισόδου

    που ονοµάσαµε τµήµα ορισµών, αυτό δηλαδή που βρίσκεται πριν από το πρώτο %%.

    Να θυµάστε, λοιπόν, ότι οι ορισµοί που µπορούν να χρησιµοποιηθούν είναι αυτοί

    που έχετε ορίσει στο πρώτο τµήµα ενός τυπικού αρχείου εισόδου.

    Όταν περιέχονται αριθµοί, η σηµασία τους καθορίζεται ως εξής:

    α) Αν περιέχεται µόνο ένας αριθµός {a}, ορίζουµε ότι η έκφραση που προηγείται

    πρέπει να επαναλαµβάνεται τόσες φορές, όση είναι η τιµή a.

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 28

  • β) Αν περιέχονται δύο αριθµοί {a,b}, τότε ορίζουµε ότι η έκφραση που προηγεί-

    ται πρέπει να επαναλαµβάνεται από a έως b φορές.

    ¶·Ú¿‰ÂÈÁÌ· 2.1

    Στο παρακάτω πρόγραµµα το lex κάνει αντικατάσταση των digit και nonzero µε τον

    αντίστοιχο ορισµό τους, ενώ το a{1,5} µπορεί να ταυτιστεί µε 1 έως 5 εµφανίσεις

    του a.

    #include

    digit [0-9]

    nonzero[1-9]

    %%

    0| {nonzero}{digit}printf(“Found an integer\n”);

    a{1,5} printf(“Found 1 to 5 occurrences of a.\n”);

    2 92 . 3 ° ƒ à º ¶ ª ∆∞ ™ ∫ ∞ ¡ √ ¡ ∂ ™ ™ ∆ √ L E X

    ÕÛÎËÛË ∞˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.2

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

    (Όπου αναφέρουµε τη λέξη «λέξεις», εννοούµε τους συνδυασµούς γραµµάτων,

    ανεξάρτητα αν έχουν ή όχι σηµασία και αποτελούνται µόνο από γράµµατα της

    αγγλικής αλφαβήτου.)

    α) Όλες τις λέξεις που περιέχουν τα φωνήεντα της αγγλικής αλφαβήτου στη σειρά.

    Τα φωνήεντα της αγγλικής αλφαβήτου είναι στη σειρά τα a, e, i, o, u.

    β) Όλες τις λέξεις που τα γράµµατα τους είναι διατεταγµένα σε αύξουσα λεξικο-

    γραφική σειρά.

    γ) Όλες τις ακολουθίες από 0 και 1 οι οποίες περιέχουν ακριβώς µία φορά τον συν-

    δυασµό 000.

    ÕÛÎËÛË ∞˘ÙÔ·ÍÈÔÏfiÁËÛ˘ 2.3

    Τι σηµαίνουν τα ακόλουθα πρότυπα κανόνων σε lex;

    α) [^’] β) ^’ γ) [^’].* δ) ‘[^’]’ ε) ‘[^’]+’ στ) “[^’]+”

    ¶ÈÓ٤Ϸ˜ II.(168Û.) 22/8/2003 13:52 ™ÂÏ›‰· 29

  • 3 0 K E º A § A I O 2 : O ° ∂ ¡ ¡ ∏ ∆ √ ƒ∞ ™ § ∂ ∫ ∆ π ∫ ø ¡ A ¡ ∞ § À ∆ ø ¡ L E X

    2.4 OÈ ÂÓ¤ÚÁÂȘ ÙÔ˘ Lex

    Όταν µια Κανονική Έκφραση ταυτιστεί στην είσοδο του Λεκτικού Αναλυτή, εκτε-

    λείται το κοµµάτι του κώδικα που αποτελεί το δεξιό σκέλος ενός κανόνα. Το δεξιό

    σκέλος του κανόνα το ονοµάζουµε ∆ράση του Κανόνα. Αν δεν έχει οριστεί ∆ράση

    από τον προγραµµατιστή, η ∆ράση που εκτελείται είναι �