ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ. Σχολή Θετικών Επιστηµών και Τεχνολογίας. Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH

Σχετικά έγγραφα
Θεωρία Πληροφορίας και Kωδικοποίησης

EÈÛ ÁˆÁ ÛÙËÓ ÏËÚÔÊÔÚÈÎ

E π A π π ª π. È ÎÚÈÙ M ıëì ÙÈÎ. Î È M ıëì ÙÈÎ ÔÁÈÎ. TfiÌÔ A' È ÎÚÈÙ M ıëì ÙÈÎ ÂÒÚÁÈÔ BÔ ÚÔ

Tεχνολογία Λογισµικού II

E π A π π ª π. Â È ÛÌfi ÔÁÈÛÌÈÎÔ. TfiÌÔ ' ÏÒÛÛÂ ÚÔÁÚ ÌÌ ÙÈÛÌÔ II. KÏÂ ÓıË Ú ÌappleÔ Ï Ë. (AÓÙÈÎÂÈÌÂÓÔÛÙÚÂÊ ÚÔÁÚ ÌÌ ÙÈÛÌfi )

E π A π π ª π TÂ ÓËÙ NÔËÌÔÛ ÓË - EÊ ÚÌÔÁ. TfiÌÔ ' ÂÓÂÙÈÎÔ AÏÁfiÚÈıÌÔÈ Î È EÊ ÚÌÔÁ. ÎÔı Ó ÛË

ÚÔÛÙ Û Î È AÛÊ ÏÂÈ ÛÙËÌ ÙˆÓ YappleÔÏÔÁÈÛÙÒÓ

E π A π π ª π AÚ TÂ ÓÔÏÔÁ ÔÁÈÛÌÈÎÔ. TfiÌÔ ' MÈ Ï ÓÔ ËÌ. XÚÈÛÙÔ Ô Ï ÎË B ÛÂÈ Â ÔÌ ÓˆÓ

ÏËÚÔÊÔÚÈÎ Î È EÎapple  ÛË

E π A π π ª π TÂ ÓËÙ NÔËÌÔÛ ÓË EÊ ÚÌÔÁ. TfiÌÔ B' NÂ ÚˆÓÈÎ ÎÙ Î È ÓÔ AÚÁ Ú ÎË EÊ ÚÌÔÁ

TËÏÂÌ ÙÈÎ, È ÎÙ Î È KÔÈÓˆÓ

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ. Σχολή Θετικών Επιστηµών και Τεχνολογίας. Πρόγραµµα Σπουδών ΠΛΗΡΟΦΟΡΙΚΗ. Θεµατική Eνότητα BΑΣΙΚΑ ΖΗΤΗΜΑΤΑ ΙΚΤΥΩΝ Η/Υ

Ψηφιακή επεξεργασία εικόνων και σηµάτων

Σχεδιασμός και Eκτίμηση Έργων

Aισθητήρες και Mικροαισθητήρες

ÚÔÁÚ ÌÌ ÙÈÛÌfi ÁÈ ÙËÓ ÔÈfiÙËÙ

ÏËÚÔÊÔÚÈÎ Î È EÎapple  ÛË

EÈÛ ÁˆÁ ÛÙËÓ ÏËÚÔÊÔÚÈÎ

Eιδικά Θέµατα υναµικής των Kατασκευών και Σεισµικής Mηχανικής

E π A π π ª π. Ú ÌÌÈÎfi ÚÔÁÚ ÌÌ ÙÈÛÌfi. MÔÓÙÂÏÔappleÔ ËÛË. TfiÌÔ A' M ÓÔ PÔ ÌÂÏÈÒÙË Î È ÚÔÛÔÌÔ ˆÛË

ÚÔÛÙ Û Î È AÛÊ ÏÂÈ ÛÙËÌ ÙˆÓ YappleÔÏÔÁÈÛÙÒÓ

EÈ ÈÎ Ì Ù ÁÈ ÙËÓ ÔÈfiÙËÙ

Θεµέλια Γραµµικού Προγραµµατισµού

ιαχείριση και Ποιότητα Λογισµικού

Mηχανολογική Σχεδίαση

K ÓÔ.ÛÂÏÈ.(168ÛÂÏ.) :13 ÂÏ 1 (M ÚÔ ÙÛ ÁÎÔ) Eπιστήµη Eπιφανειών

OÈÎÔÓÔÌÈÎ T ÓÈÎÒÓ ŒÚÁˆÓ

È Â ÚÈÛË YÁÚÒÓ AappleÔ Ï ÙˆÓ

Eισαγωγή στην Πυρηνική Φυσική

È Â ÚÈÛË ÙÂÚÂÒÓ AappleÔ Ï ÙˆÓ

E π A π π ª π AÚ TÂ ÓÔÏÔÁ ÔÁÈÛÌÈÎÔ. TfiÌÔ B' ÂÈÙÔ ÚÁÈÎ ÛÙ Ì Ù I

K Ì ÚÈÓfi (232ÛÂÏ.) 23/3/ :03 ÂÏ 1. Mικροηλεκτρονική

ÈÓÙ Ï II.(168Û.) 22/8/ :52 ÂÏ 1. Mεταγλωττιστές

E π A π π ª π º ÛÈÎÔ ËÌÂ. TfiÌÔ ' Ù ÙÈÛÙÈÎ ÂÚÌÔ Ó ÌÈÎ BÏ ÛË M Ú ÓÙ

ÚÔÁÚ ÌÌ ÙÈÛÌfi ÁÈ ÙËÓ ÔÈfiÙËÙ

ÚÔËÁÌ Ó EÚÁ ÏÂ Î È M ıô ÔÈ ÁÈ ÙÔÓ ŒÏÂÁ Ô ÙË ÔÈfiÙËÙ

KO MA E I O OIH H 30/5/ :32 ÂÏ 1. Eπιστήµη Πολυµερών

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ. Σχολή Θετικών Επιστηµών και Τεχνολογίας. Πρόγραµµα Σπουδών ΠΛΗΡΟΦΟΡΙΚΗ. Θεµατική Eνότητα

E π A π π ª π. ÚÔÁÚ ÌÌ ÙÈÛÌfi. ÁÈ ÙËÓ ÔÈfiÙËÙ. TfiÌÔ A' Â È ÛÌfi. ÁÈ ÙËÓ ÔÈfiÙËÙ. AÁÁÂÏfiappleÔ ÏÔ

ÚÔÛÙ Û Î È AÛÊ ÏÂÈ ÛÙËÌ ÙˆÓ YappleÔÏÔÁÈÛÙÒÓ

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ. Σχολή Θετικών Επιστηµών και Τεχνολογίας. Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH. Θεµατική Ενότητα ΣYΓXPONA IKTYA KAI YΠHPEΣIEΣ

B ÛÈÎ EÚÁ ÏÂ Î È M ıô ÔÈ ÁÈ ÙÔÓ ŒÏÂÁ Ô ÙË ÔÈfiÙËÙ

Aρχές Διοίκησης Επιχειρήσεων

OÈÎÔÓÔÌÈÎ T ÓÈÎÒÓ ŒÚÁˆÓ

Σύµµικτες Kατασκευές

Eπικοινωνία Aνθρώπου Yπολογιστή

E π A π Δ π Δ ª π. NÔÌÔıÂÛ Î È AÛÊ ÏÂÈ T ÓÈÎÒÓ ŒÚÁˆÓ. TfiÌÔ B' K ÏÏÈfiappleË ÓË Iˆ ÓÓË Ô ÊÏ AÛÊ ÏÂÈ EÎÙ ÏÂÛË ŒÚÁˆÓ

E π A π π ª π OÚÁ ÓÈÎ XËÌÂ. TfiÌÔ ' º ÛÌ ÙÔÛÎÔapple OÚÁ ÓÈÎÒÓ EÓÒÛˆÓ. I.. ÂÚÔı Ó ÛË

Στοχαστική υναµική των Kατασκευών

E π A π π ª π KÏ ÛÈÎ º ÛÈÎ I. TfiÌÔ ' HÏÂÎÙÚÔÌ ÁÓËÙÈÛÌfi. NÈÎfiÏ Ô. K Ï ÊË

Eγκυροποίηση Λογισµικού

Aποτίµηση Σεισµικών Bλαβών, Eπισκευές και Eνισχύσεις Kτιρίων Oπλισµένου Σκυροδέµατος

È Â ÚÈÛË ÙÂÚÂÒÓ AappleÔ Ï ÙˆÓ

È Â ÚÈÛË YÁÚÒÓ AappleÔ Ï ÙˆÓ

Aξιοπιστία και Συντήρηση

NÔÌÔıÂÛ Î È AÛÊ ÏÂÈ T ÓÈÎÒÓ ŒÚÁˆÓ

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ. Σχολή Θετικών Επιστηµών και Τεχνολογίας. Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH. Θεµατική Ενότητα ΣYΓXPONA IKTYA KAI YΠHPEΣIEΣ

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ. Σχολή Θετικών Επιστηµών και Τεχνολογίας. Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH

ÔÌ Î È ÂÈÙÔ ÚÁ ÙÔ K ÙÙ ÚÔ

Σχεδίαση Λογισμικού. Σημείωση

Aλγόριθµοι Γραµµικού Προγραµµατισµού και Θεωρία Παιγνίων

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Σχολή Θετικών Επιστηµών και Τεχνολογίας. Πρόγραµµα Σπουδών ΠΡΟΧΩΡΗΜΕΝΕΣ ΣΠΟΥ ΕΣ ΣΤΗ ΦΥΣΙΚΗ.

Προχωρημένα Ζητήματα Σχεδιασμού Κατανεμημένων Συστημάτων Εγχειρίδιο Μελέτης

Eπιστήµη Yλικών: Mαγνητικά Yλικά

TÂ ÓËÙ NÔËÌÔÛ ÓË - EÊ ÚÌÔÁ

H EÍ ÏÈÍË ÙˆÓ I ÂÒÓ ÛÙÈ º ÛÈÎ EappleÈÛÙ ÌÂ

Ζητήματα Σχεδιασμού και Προγραμματισμού Συστημάτων ΔιάχυτουΥπολογισμού

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

Αλγόριθμοι και Πολυπλοκότητα

Oικολογία Aπό τη Bιόσφαιρα στους Πληθυσµούς

È Â ÚÈÛË ÙÂÚÂÒÓ AappleÔ Ï ÙˆÓ

E π A π π ª π º ÛÈÎÔ ËÌÂ. TfiÌÔ E' º ÛÌ ÙÔÛÎÔapple ºÒÙË NÙ

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

Προηγμένα Θέματα Δικτύων Υπολογιστών

Τεχνολογία Λογισμικού

ÈÔÈÎËÙÈÎ appleè ÂÈÚ ÛÂˆÓ Î È ÚÁ ÓÈÛÌÒÓ

Διαχείριση Δεδομένων

Σχεδίαση Middleware Εγχειρίδιο Μελέτης

μ ÛÈÎ Ú ÈÎ Ô Î È ÈÔ ÎËÛË

E π A π π ª π ÂÓÂÙÈÎ. TfiÌÔ ' EÍ ÏÈÍË ÂÒÚÁÈÔ PÔ ÎË

Αρχιτεκτονικές Συστημάτων Διάχυτου και Σφαιρικού Υπολογισμού

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

Aνάλυση Eικόνας και Aναγνώριση Προτύπων

Εισαγωγή Συμβόλαιο Μαθήματος

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ. Σχολή Θετικών Επιστηµών και Τεχνολογίας. Πρόγραµµα Σπουδών ΣΠOY EΣ ΣTIΣ ΦYΣIKEΣ EΠIΣTHMEΣ.

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

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

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

Προγραμματισμός Η/Υ. Προτεινόμενα θέματα εξετάσεων Εργαστήριο. Μέρος 1 ό. ΤΕΙ Λάρισας- Σχολή Τεχνολογικών Εφαρμογών Τμήμα Πολιτικών Έργων Υποδομής

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

Α. Ερωτήσεις Ανάπτυξης

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

XPI TO OY AKH (96ÛÂÏ.) 22/8/ :39 ÂÏ 1. Bάσεις εδοµένων

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

Εφαρμογές Φωτισμού και Πολυμεσικές Εφαρμογές

H EÍ ÏÈÍË ÙˆÓ I ÂÒÓ ÛÙÈ º ÛÈÎ EappleÈÛÙ ÌÂ

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

Μεταγλωττιστές Ενότητα 1: Εισαγωγή

E π A π π ª π ÂÓÂÙÈÎ. TfiÌÔ B' º ÛÈÔÏÔÁ. AÓÙÈÁfiÓË Ô

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

Transcript:

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

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Σχολή Θετικών Επιστηµών και Τεχνολογίας Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH Θεµατική Ενότητα ΠΡΑΚΤΙΚΗ ΕΞΑΣΚΗΣΗ ΣΕ ΘΕΜΑΤΑ ΛΟΓΙΣΜΙΚΟΥ Τόµος A' Mεταγλωττιστές ΠΑΝΑΓΙΩΤΗΣ ΠΙΝΤΕΛΑΣ Kαθηγητής Tµήµατος Mαθηµατικών Πανεπιστηµίου Πατρών ΠΑΝΑΓΙΩΤΗΣ ΑΛΕΦΡΑΓΚΗΣ ιδάκτωρ Hλεκτρολόγος Mηχανικός & Tεχνολογίας H/Y ΠATPA 2003

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Σχολή Θετικών Επιστηµών και Τεχνολογίας Πρόγραµµα Σπουδών ΠΛHPOΦOPIKH Θεµατική Ενότητα ΠΡΑΚΤΙΚΗ ΕΞΑΣΚΗΣΗ ΣΕ ΘΕΜΑΤΑ ΛΟΓΙΣΜΙΚΟΥ Τόµος A' MΕΤΑΓΛΩΤΤΙΣΤΕΣ Συγγραφή ΠANAΓIΩTHΣ ΠINTEΛAΣ Kαθηγητής Tµήµατος Mαθηµατικών Πανεπιστηµίου Πατρών ΠANAΓIΩTHΣ AΛEΦPAΓKHΣ ιδάκτωρ 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, απαγορεύεται η συνολική ή αποσπασµατική αναδηµοσίευση του βιβλίου αυτού ή η αναπαραγωγή του µε οποιοδήποτε µέσο χωρίς την άδεια του εκδότη.

ÂÚÈ fiìâó Πρόλογος... 11 K º π 1 EÈÛ ÁˆÁ Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, 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 º π 2 O ÂÓÓ ÙÔÚ ÂÎÙÈÎÒÓ AÓ Ï ÙÒÓ Lex Σκοπός, Προσδοκώµενα αποτελέσµατα, Έννοιες κλειδιά, Eισαγωγικές παρατηρήσεις... 23 2.1 Eισαγωγή... 24 2.2 Προγραµµατίζοντας µε το Lex... 25

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

EPIEXOMENA 7 3.4 Aνάνηψη από λάθη... 53 3.4.1 Στρατηγικές ανάνηψης από λάθος... 55 3.4.2 Aνάνηψη από λάθος σε συντακτικό αναλυτή LR... 56 Σύνοψη... 59 K º π 4 O ÂÓÓ ÙÔÚ ÓÙ ÎÙÈÎÒÓ 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

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

EPIEXOMENA 9 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

ÚfiÏÔÁÔ Ο τόµος που έχετε στα χέρια σας αποτελεί συνέχεια του τόµου «Μεταγλωττιστές», του οποίου θα πρέπει να έχετε µελετήσει και ολοκληρώσει τις Ασκήσεις Αυτοαξιολόγησης, όπως, φυσικά, και τις ραστηριότητες που περιλαµβάνει. Βασικός στόχος του τόµου είναι να σας βοηθήσει να συµπληρώσετε τις γνώσεις σας στους µεταφραστές γενικότερα, αλλά και να αποκτήσετε πρακτική εµπειρία στην κατασκευή ένος πραγµατικού (αλλά προφανώς µικρού, λόγω όγκου δουλειάς) µεταγλωττιστή ή διερµηνευτή. Ο τόµος αυτός έχει γίνει προσπάθεια να γραφτεί σύµφωνα µε τις οδηγίες και τα πρότυπα του Ελληνικού Ανοικτού Πανεπιστηµίου και προέρχεται από υλικό το οποίο διδάσκεται στο Τµήµα Μηχανικών Η/Υ και Πληροφορικής του Πανεπιστηµίου Πατρών. Για να φτάσει ο τόµος στη µορφή αυτή, βοήθησαν σηµαντικά τόσο τα σχόλια του Κριτικού Αναγνώστη, συνάδελφου Ι. Κοτρώνη, όσο και του επίσης συνάδελφου και Ακαδηµαϊκού Υπεύθυνου της Θεµατικής Ενότητας Σ. Κάτσικα. Με την ευκαιρία αυτή θέλουµε να ευχαριστήσουµε θερµά και τους δύο. Στο Kεφάλαιο 1 θα δείτε την αρχιτεκτονική δοµή ενός µεταγλωττιστή, τις διαδικασίες ανάπτυξής του και θα έρθετε σε µια πρώτη επαφή µε τα εργαλεία που θα χρησιµοποιήσετε, αργότερα για να αναπτύξετε και εσείς έναν τέτοιο µεταφραστή. Στο Kεφάλαιο 2 θα µάθετε πώς µπορείτε να περιγράφετε τις λεκτικές µονάδες (tokens) µιας γλώσσας και πώς µπορείτε να κατασκευάζετε ένα λεκτικό αναλυτή, ο οποίος θα αναγνωρίζει λεκτικές µονάδες από την είσοδό του. Για να επιτύχετε αυτό το σκοπό, θα µάθετε να χρησιµοποιείτε το πιο δηµοφιλές εργαλείο κατασκευής λεκτικών αναλυτών, το lex. Το Kεφάλαιο 3 περιέχει υλικό το οποίο θα σας βοηθήσει στην κατανόηση του τρόπου λειτουργίας των συντακτικών αναλυτών της κατηγορίας LL και (κυρίως) LR, όπως αυτοί οι οποίοι παράγονται από το εργαλείο Yacc, το οποίο και θα χρησιµοποιήσετε για την κατασκευή µεταγλωττιστών. Το Kεφάλαιο 4 θα σας υπενθυµίσει πώς µπορείτε να περιγράφετε τη συντακτική δοµή µιας γλώσσας προγραµµατισµού και πώς µπορείτε να κατασκευάζετε ένα συντακτικό αναλυτή, ο οποίος θα αναγνωρίζει τη συντακτική δοµή από την είσοδό του. Για να επιτύχετε αυτό το σκοπό, θα µάθετε να χρησιµοποιείτε το πιο δηµοφιλές εργαλείο κατασκευής συντακτικών αναλυτών, το Yacc. Στο Kεφάλαιο 5 θα µάθετε την παραγωγή τελικού κώδικα για την αρχιτεκτονική επεξεργαστών RISC. Για να το επιτύχετε αυτό, θα µάθετε τη δοµή και το ρεπερτόριο εντολών του εξοµοιωτή της γενιάς επεξεργαστών MIPS R2/3Κ spim και τις σηµαντικότερες εντολές του επεξεργαστή.

12 M ø π Στο Kεφάλαιο 6 περιγράφεται η οργανωτική δοµή και ο τρόπος λειτουργίας των διερµηνευτών, έτσι ώστε να είστε σε θέση όχι µόνο να κατανοείτε, αλλά και να κατασκευάζετε έναν απλό διερµηνευτή. Στο τελευταίο κεφάλαιο θα κατασκευάσετε τον πρώτο σας µεταγλωττιστή ή διερµηνευτή. Η γλώσσα την οποία καλείστε να µεταφράσετε ή να διερµηνεύσετε είναι ένα υποσύνολο της γλώσσας προγραµµατισµού C. Για να επιτύχετε αυτό το σκοπό, θα µάθετε πώς µπορείτε να χρησιµοποιείτε τη γνώση που αποκτήσατε στα προηγούµενα κεφάλαια µέσα από ένα σύνολο ραστηριοτήτων, οι οποίες θα σας κατευθύνουν µε συστηµατικό τρόπο στην τελική κατασκευή του µεταγλωττιστή ή διερµηνευτή σας.

ÂÓÈÎ BÈ ÏÈÔÁÚ Ê Η κατασκευή µεταγλωττιστών αποτελεί µια πολύ ενδιαφέρουσα και δηµιουργική ενασχόληση µε πάρα πολλές πρακτικές προεκτάσεις και δυνατότητες για όσους στοχεύουν να ασχοληθούν σοβαρά µε τη σχεδίαση και την ανάπτυξη λογισµικού συστη- µάτων και εφαρµογών. Υπάρχει εκτενής βιβλιογραφία σχετική µε τους µεταγλωττιστές, η οποία, όµως, παρουσιάζει µια ιδιοµορφία που είναι αποτέλεσµα τριών παραγόντων: της πολυπλοκότητας των µεταγλωττιστών, του εξαιρετικά µεγάλου όγκου της θεωρητικής γνώσης που είναι απαραίτητη για µια πλήρη θεωρητική τεκµηρίωση και του γεγονότος ότι, για να δοθεί ένα ολοκληρωµένο παράδειγµα κατασκευής ενός µετρίου µεγέθους µεταγλωττιστή, χρειάζεται ένα ογκώδες βιβλίο µόνο γι αυτό. Έτσι, αφενός µεν δεν υπάρχουν βιβλία που θα σας καλύψουν πλήρως θεωρητικά και πρακτικά, αφετέρου δε τα υπάρχοντα βιβλία καλύπτουν κατά κανόνα τον έναν από τους δυο αυτούς άξονες και είναι (εκτός ελαχίστων περιπτώσεων) εξαιρετικά µεγάλης έκτασης. Για το λόγο αυτό στη Θεµατική Υποενότητα «Μεταγλωττιστές» σας έχει δοθεί το «βασικό» θεωρητικό και λειτουργικό πλαίσιο µε απλό και κατανοητό τρόπο και η κατά το δυνατόν λιγότερη θεωρία, ενώ στη Θεµατική Υποενότητα «Εργαστηριακές Ασκήσεις Μεταγλωττιστών» (ΘΕ 9.1) που έχετε στα χέρια σας σάς δίνεται συµπληρωµατικό θεωρητικό και πρακτικό υλικό καθώς και εργαλεία, ώστε µέσω µιας σειράς αυξητικών ασκήσεων να έχετε τη δυνατότητα να κατασκευάσετε ένα µικρό µεταγλωττιστή ή διερµηνευτή. Παρακάτω προτείνονται ορισµένα πολύ καλά βιβλία που µπορούν να χρησιµοποιηθούν παράλληλα µε το κείµενο της Θεµατικής Υποενότητας που έχετε στα χέρια σας για την πληρέστερη κατανόηση της ύλης και την ολοκλήρωση των εργαστηριακών ασκήσεων. [1] J. Levine, T. Mason & D.Brown, Lex and Yacc (2nd ed.), O Reilly and Associates, 1992. Πολύ καλό βιβλίο που παρουσιάζει αναλυτικά, µε πολλά παραδείγµατα, τη χρήση του lex και του yacc στην πράξη. Είναι το βιβλίο που θα έχετε πάντα κοντά σας, όταν θα αρχίσετε να υλοποιείτε ένα µεταγλωττιστή. [2] R. Ηunter, Compilers: Τheir Design and Construction Using Ρascal, John Wiley & Sons, 1985. Είναι ένα καλογραµµένο βιβλίο για σχεδίαση µεταγλωττιστών, στο οποίο οι διάφοροι αλγόριθµοι που περιγράφονται είναι γραµµένοι σε Pascal. Το βιβλίο αυτό είναι από τα ελάχιστα βιβλία για µεταγλωττιστές µε τόσο µικρό αριθµό σελίδων (272), που, όµως, καλύπτει ικανοποιητικά το αντικείµενό του για προπτυχιακό επίπεδο. Θεωρούµε ότι µαζί µε το βιβλίο του Μ. Σκορδαλάκη (δείτε παρακάτω) αποτελεί καλό συµπληρωµατικό υλικό. ίνει βασικές αρχές

166 M ø π και λειτουργίες χωρίς, όµως, έµφαση σε πρακτικές εφαρµογές, διότι τότε θα αύξανε ο όγκος του βιβλίου κατά πολύ. Ένα ιδιαίτερο χαρακτηριστικό αυτού του βιβλίου είναι η χρήση του Pascal P code ως ενδιάµεσου κώδικα υποθετικής µηχανής (µηχανή Pascal) και η δηµιουργία Assembly κώδικα από τον Pascal P code. [3] A. V. Aho, R. Sethi, J. D. Ullman, Compilers: Ρrinciples techniques and Τools, Addison Wesley, 1986 (ISBN 0 201 10088 6), γνωστό και ως «το βιβλίο του δράκου» από την παράσταση που έχει στο εξώφυλλό του. Είναι βιβλίο αναφοράς και περιγράφει σε βάθος τις τεχνικές λεκτικής και συντακτικής ανάλυσης, συµπεριλαµβανοµένων αυτών που χρησιµοποιούνται στα lex και yacc. Πρόκειται για το κλασικότερο σύγγραµµα σε αρχές, τεχνικές, θεωρία και εργαλεία για τη σχεδίαση και κατασκευή µεταφραστικών συστηµάτων. Καλύπτει ολόκληρο το απαιτούµενο βασικό θεωρητικό υπόβαθρο για όλες τις φάσεις της µεταφραστικής διαδικασίας και περιλαµβάνει πολύ εκτεταµένη βιβλιογραφία. ε θα βρείτε στο βιβλίο αυτό πολλές συνταγές του τύπου «πώς το φτιάχνω» και γι αυτό το λόγο ορισµένοι το θεωρούν πολύ «θεωρητικό». ε συµµεριζόµαστε αυτή την άποψη (όπως και αρκετοί άλλοι συνάδελφοι) και το θεωρούµε ως το πιο πλήρες πανεπιστηµιακό σύγγραµµα, το οποίο λόγω της έκτασής του µπορεί να χρησιµοποιηθεί σε προπτυχιακό αλλά και σε εισαγωγικό µεταπτυχιακό επίπεδο. [4] Ronald Mak, Writing Compilers & Interpreters, An Applied Approach Using C ++, Second Edition, John Wiley, 1996. Το βιβλίο αυτό σας διδάσκει πώς να δηµιουργήσετε µεταγλωττιστές και διερµηνευτές από καθαρά πρακτική σκοπιά. Απευθύνεται σε «πρακτικούς» προγραµµατιστές, οι οποίοι δεν επιθυµούν να διαβάσουν άλλα πιο παραδοσιακά «θεωρητικά» βιβλία σε σχεδίαση µεταγλωττιστών, έχουν, όµως, σηµαντική προγραµµατιστική εµπειρία και φυσικά τις προαπαιτούµενες γνώσεις αυτής της Θεµατικής Υποενότητας. Σας το συνιστούµε ως ένα πολύ καλό «εργαστηριακό» βιβλίο µε µεγάλο αριθµό πρακτικών Παραδειγµάτων. Καταπιάνεται µε την κατασκευή ενός διερµηνευτή, ενός αλληλεπιδραστικού εκσφαλµατωτή και ενός µεταγλωττιστή της Pascal και παράγει κώδικα για τον επεξεργαστή 8086. [5] Μ. Σκορδαλάκης, Εισαγωγή στους Μεταγλωττιστές, ΕΜΠ, Aθήνα, 1993. Το βιβλίο αυτό προορίζεται ως βοήθηµα σε ένα µάθηµα εισαγωγικό στη σχεδίαση και κατασκευή µεταγλωττιστών. ίνει έµφαση στα πρακτικά προβλήµατα σχεδίασης και υλοποίησης και όχι στα θεωρητικά. Έτσι, µπορεί να θεωρηθεί πολύ καλό συµπληρωµατικό διδακτικό υλικό και καλύπτει προσεκτικά επιλεγµένη ύλη που µπορεί να χρησιµοποιηθεί για την υλοποίηση ενός µεταγλωττιστή. Στην

π Bπµ π ƒ ºπ 167 παρούσα έκδοση (1993) η υποθετική µηχανή (υπολογιστής) που είχε χρησιµοποιηθεί παλαιότερα αντικαταστάθηκε από IBM PC µε επεξεργαστή 8086. [6] Bennett J.P., Introduction to Compiling Techniques A First Course Using ANSI C, Lex and Yacc, McGraw Hill, 1990. Επίσης πολύ καλό βιβλίο για αρχάριους. Τον πηγαίο κώδικα των παραδειγµάτων µπορείτε να τον βρείτε στη διεύθυνση ftp://ftp.bath.ac.uk. [7] J Ρ. Τremblay, Ρ. Sorenson, Τhe Τheory and Ρractice of Compiler Writing, ΜcGraw Ηill, 1985. Το βιβλίο αυτό είναι αρκετά προχωρηµένο και µπορεί να χρησιµοποιηθεί σε µάθηµα «Σχεδίαση Μεταγλωττιστών» δύο εξαµήνων, είτε σε προχωρηµένο προπτυχιακό επίπεδο είτε σε εισαγωγικό µεταπτυχιακό επίπεδο. Για να µπορέσετε να το διαβάσετε και να το κατανοήσετε, θα πρέπει να έχετε τουλάχιστον ένα χρόνο πρακτική εµπειρία σε κάποια γλώσσα προγραµµατισµού και βασικές γνώσεις από Αρχιτεκτονική Υπολογιστών, γλώσσα Assembly, οµές εδοµένων και ιακριτά Μαθηµατικά. [8] D. Gries, Compiler Construction for Digital Computers, John Wiley & Sons, 1971. Είναι ένα από τα πρώτα (ίσως το πρώτο) βιβλία που γράφτηκαν για σχεδίαση µεταγλωττιστών. Παρουσιάζει για πρώτη φορά µε συστηµατικό και θεωρητικά τεκµηριωµένο τρόπο όλες τις φάσεις της µεταφραστικής διαδικασίας. Αφιερώνει ένα σηµαντικό µέρος της ύλης του στη «θεωρία τυπικών γλωσσών», καλύπτει, όµως, και τα υπόλοιπα θέµατα, όπως ανάνηψη από λάθη, δηµιουργία κώδικα, βελτιστοποίηση κλπ. Αν και µπορεί να θεωρήσει κανείς ότι είναι ξεπερασµένο, από την άποψη ότι δεν καλύπτει αναλυτές LL(1) και LR(1), παρόλ αυτά αποτελεί το πρώτο σοβαρό και πλήρες σύγγραµµα για την εποχή του και σηµαντικό µέρος της ύλης του παραµένει επιστηµονικά επίκαιρο. Για παράδειγµα, το κεφάλαιο για τους διερµηνευτές παραµένει κλασικό. [9] Axel T. Schreiner and H. George Friedman, Jr., Introduction to Compiler Construction with UNIX, Prentice Hall, 1985. Πολύ καλό βιβλίο για αρχάριους στην κατασκευή µεταγλωττιστών. Έχει, όµως, αρκετά τυπογραφικά λάθη. Παρέχεται, επίσης, ο πηγαίος κώδικας για την κατασκευή ενός υποσυνόλου της C στη διεύθυνση ftp://a.cs.uiuc.edu/pub/friedman/tar. [10] M.E.Lesk & E.Schmidt, Lex A Lexical Analyzer Generator: Bρείτε το στο Internet δωρεάν. Είναι το εγχειρίδιο οδηγιών του lex και παρά την ηλικία του αποτελεί και σήµερα ένα άριστο εισαγωγικό κείµενο. [11]Kernighan and Ritchie, The C Programming Language, Prentice Hall, 1978.

168 M ø π [12] Vern Paxson, Flex version 2.5 A fast scanner generator, Edition 2.5, March 1995: βρείτε το στο Internet δωρεάν, http://www.combo.org/lex ycc page/. Μαζί θα βρείτε και το πρόγραµµα Flex που είναι µια υλοποίηση του lex που διανέµεται και αυτή δωρεάν. [13] Stephen C. Johnson, Yacc: Yet Another Compiler Compiler: Bρείτε το στο Internet δωρεάν, http://www.combo.org/lex ycc page/. Είναι το εγχειρίδιο οδηγιών του yacc και παρά την ηλικία του αποτελεί και σήµερα ένα άριστο εισαγωγικό κείµενο. [14] Charles Donnelly and Richard Stallman, Bison The YACC compatible Parser Generator: Bρείτε το στο Internet δωρεάν, http://www.combo.org/lex ycc page/. Μαζί θα βρείτε και το πρόγραµµα Bison που είναι µια υλοποίηση του yacc που διανέµεται και αυτή δωρεάν. [15] F.R.A. Hopgood, COMPILING TECHNIQUES, American Elsevier, 1969 (American SBN 444 19769 9). [16] Τ. Ρittman and J. Ρeters, Τhe Art of Compiler Design, Τheory and Ρractise, Ρrentice Ηall, 1992. [17] S. S. Muchnick, Advanced COMPILER DESIGN & IMPLEMENTATION, Morgan Kaufman, 1997. [18] Hennessy & Patterson, Computer Organization and Design: The Hardware/ Software Interface, Morgan Kaufman, 1997. [19] J. Larus, Spim S20: A MIPS R2000 simulator, http://www.cs.wisc.edu/~larus/spim/spim documentation.pdf.