ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ Τμήμα Ηλεκτρονικών Μηχανικών & Μηχανικών Υπολογιστών Τομέας Πληροφορικής

Σχετικά έγγραφα
Εργασία Προγραµµατισµού

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

Εργασία Προγραµµατισµού

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

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

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

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

Μεταγλωττιστές 2019 Θέμα εργασίας

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

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

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

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

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

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

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

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

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

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

Εντολή Δεδομένα Περιεχόμενα μετά την εκτέλεση 1 read(x) 122 x= 2 read(a,b,c) a= b= c= 3 read(d,e)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Βασικές Αρχές Προγραμματισμού

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

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

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

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

Μεταγλωττιστές 2018 Θέμα εργασίας

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

Βασικές έννοιες προγραμματισμού

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

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

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

ΜΑΗΣ ΕΞΕΤΑΣΤΙΚΟ ΔΟΚΙΜΙΟ

ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ PASCAL

Pascal. 15 Νοεμβρίου 2011

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

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

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

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Εισαγωγή στην FORTRAN. Δρ. Ιωάννης Λυχναρόπουλος

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Κεφάλαιο 7 ο Βασικές Έννοιες Προγραμματισμού (σελ )

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ ΝΕΟ ΚΑΙ ΠΑΛΑΙΟ ΣΥΣΤΗΜΑ

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

Παρουσίαση του εργαλείου BISON

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

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

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

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

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

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

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

Δομή Προγράμματος C++, Χειρισμός Μεταβλητών και Συναρτήσεις Εισόδου - Εξόδου

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

ΘΕΜΑΤΑ ΤΕΛΙΚΗΣ ΦΑΣΗΣ

Πρόβλημα 29 / σελίδα 28

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

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

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

Αποτελέσματα προόδου

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

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

Μεταγλωττιστές 2017 Θέμα εργασίας

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / Γ ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ: 27/01/2013

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

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

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Μεταγλωττιστές 2015 Θέμα εργασίας. Η γλώσσα Tony. Sir Charles Antony (Tony) Richard Hoare (1934 ) Prof. Emeritus, Oxford University.

Γραφικά υπολογιστών Εργαστήριο 1 Εισαγωγή στην Python

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

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

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

A3. Μονάδες 5 Α4. Μονάδες 10 ΘΕΜΑ B. Β1. writeln Περιεχόμενα Εντολή Αποτελέσματα Παραμέτρων Μονάδες 20 ΘΕΜΑ Γ.

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

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

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

Transcript:

ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ Τμήμα Ηλεκτρονικών Μηχανικών & Μηχανικών Υπολογιστών Τομέας Πληροφορικής ΠΛΗ 401 ΘΕΩΡΙΑ ΥΠΟΛΟΓΙΣΜΟΥ Χειμερινό Εξάμηνο 2005-2006 Διδάσκων: Μιχαήλ Γ. Λαγουδάκης Προγραμματιστική Εργασία Εξαμήνου (25% του τελικού βαθμού) Επιμέλεια εργασίας Εριέττα Λιάρου Παρασκευή Ραυτοπούλου Χρήστος Τρυφωνόπουλος σελ. 1/14

1. Εισαγωγή Η προγραμματιστική εργασία του μαθήματος Θεωρίας Υπολογισμού αφορά στη σχεδίαση και υλοποίηση των αρχικών σταδίων ενός μεταγλωττιστή για τη γλώσσα MiX, η οποία περιγράφεται αναλυτικά παρακάτω. Για την υλοποίηση του μεταγλωττιστή θα χρησιμοποιήσετε τη γλώσσα C και τα εργαλεία flex και bison. Περισσότερες πληροφορίες σχετικά με αυτά τα εργαλεία υπάρχουν στην ιστοσελίδα του μαθήματος (http://www.intelligence.tuc.gr/~theory). Η εργασία θα αποτελείται από δύο στάδια: 1. Υλοποίηση λεκτικού αναλυτή με flex Μονάδες: 1.0 Ημερομηνία παράδοσης: 31-10-2005 2. Υλοποίηση συντακτικού αναλυτή με bison Μονάδες: 1.5 Ημερομηνία παράδοσης: 02-12-2005 Παρατηρήσεις: 1. Η εκπόνηση της εργασίας θα γίνει στους Η/Υ που βρίσκονται στο Εργαστήριο Συστημάτων Λογισμικού (ή εναλλακτικά του Μηχανογραφικού Κέντρου). Η εργασία θα εκπονηθεί από ομάδες φοιτητών που θα αποτελούνται από το πολύ 2 άτομα. 2. Η εξέταση της εργασίας και η βαθμολογία θα είναι ατομική! Η εξέταση της εργασίας θα γίνει μετά την παράδοση και του 2 ου μέρους. Οι ημερομηνίες και οι ώρες της εξέτασης θα ανακοινωθούν εγκαίρως. 3. Όλες οι φάσεις της εργασίας θα πρέπει να στέλνονται εμπρόθεσμα στο theory@intelligence.tuc.gr και όχι στο email του διδάσκοντα, των βοηθών ή στην λίστα του μαθήματος. Θα στέλνετε ένα.zip με τα επώνυμα της ομάδας (π.χ. Raftopoulou_Trifonopoulos.zip) που θα περιέχει τον κώδικα σας και ένα README αρχείο με επεξηγήσεις αν το κρίνετε απαραίτητο. 4. Μαζί με το 2 ο μέρος της εργασίας, εκτός από τον κώδικα, θα πρέπει να παραδώσετε και μια αναλυτική αναφορά, η οποία θα καλύπτει την εργασία στο σύνολό της και θα αναλύει τις τεχνικές που χρησιμοποιήθηκαν ή τις ιδιαιτερότητες της εργασίας σας. Για τις αναφορές σας θα πρέπει να χρησιμοποίησετε κάποιο κειμενογράφο (Microsoft Word, LaTeX κλπ.) για να γίνουν δεκτές. Οι αναφορές δεν πρέπει να περιλαμβάνουν εκτύπωση του κώδικα! 5. Η εξέταση των εργασιών θα γίνει στο Εργαστήριο Συστημάτων Λογισμικού. Η κάθε ομάδα φοιτητών είναι υπεύθυνη για να βεβαιωθεί ότι όλα τα εργαλεία που χρειάζονται για την επίδειξη του συστήματός τους (π.χ. C, flex, bison) είναι διαθέσιμα στο εργαστήριο. Οδηγίες για την εγκατάσταση αυτών των εργαλείων υπάρχουν στην ιστοσελίδα του μαθήματος. 6. Οι ημερομηνίες παράδοσης είναι αυστηρές και οι εκπρόθεσμες εργασίες δε θα γίνονται δεκτές. Αν δεν παραδώσετε κάποιο στάδιο της εργασίας θα χάνετε όλους τους βαθμούς που αναλογούν σε αυτό το στάδιο. σελ. 2/14

2. Η γλώσσα προγραμματισμού MiX Η γλώσσα MiX βασίζεται σε ένα υποσύνολο της ISO Pascal, είναι όμως εμπλουτισμένη με αρκετές παραλλαγές. Λόγω των πολλών ομοιοτήτων της MiX με την Pascal από πλευράς σύνταξης η περιγραφή θα είναι σύντομη με εξαίρεση τα σημεία όπου οι δυο γλώσσες διαφέρουν. 2.1 Λεκτικές Μονάδες Οι λεκτικές μονάδες της γλώσσας MiX χωρίζονται στις παρακάτω κατηγορίες: Τις λέξεις κλειδιά, οι οποίες είναι οι παρακάτω: and array boolean char define div do else false function goto if include integer mod not of or procedure program real repeat result return then true until var while Τα αναγνωριστικά, τα οποία αποτελούνται από ένα πεζό ή κεφαλαίο γράμμα του λατινικού αλφαβήτου, πιθανώς ακολουθούμενο από μια σειρά πεζών ή κεφαλαίων γραμμάτων, δεκαδικών ψηφίων ή χαρακτήρων υπογράμμισης (underscore). Ένα αναγνωριστικό δεν μπορεί να αρχίζει από ψηφίο. Τα πεζά γράμματα θεωρούνται διαφορετικά από τα αντίστοιχα κεφαλαία, επομένως τα ονόματα foo, Foo και FOO είναι όλα διαφορετικά. Επίσης, τα αναγνωριστικά δεν πρέπει να συμπίπτουν με τις λέξεις κλειδιά που αναφέρθηκαν παραπάνω. Οι ακέραιες σταθερές, που αποτελούνται από ένα προαιρετικό πρόσημο και ένα ή περισσότερα δεκαδικά ψηφία. Παραδείγματα ακέραιων σταθερών είναι τα ακόλουθα: 0-42 1284 +00200 Οι πραγματικές σταθερές, που αποτελούνται από ένα προαιρετικό πρόσημο και ένα ακέραιο μέρος, ένα κλασματικό μέρος και ένα προαιρετικό εκθετικό μέρος. Το ακέραιο μέρος αποτελείται από ένα ή περισσότερα δεκαδικά ψηφία. Το κλασματικό μέρος αποτελείται από το χαρακτήρα. της υποδιαστολής, ακολουθούμενο από ένα ή περισσότερα δεκαδικά ψηφία. Τέλος, το εκθετικό μέρος αποτελείται από το πεζό ή κεφαλαίο γράμμα E, ένα προαιρετικό πρόσημο + ή - και ένα ή περισσότερα δεκαδικά ψηφία. Παραδείγματα πραγματικών σταθερών είναι τα ακόλουθα: 42.0 +4.2e1 0.420E+2-42000.0e-3 Οι σταθεροί χαρακτήρες, που αποτελούνται από ένα χαρακτήρα μέσα σε απλά εισαγωγικά. Ο χαρακτήρας αυτός μπορεί να είναι οποιοσδήποτε κοινός χαρακτήρας ή ακολουθία διαφυγής (escape sequence). Κοινοί χαρακτήρες είναι όλοι οι εκτυπώσιμοι χαρακτήρες πλην των απλών και διπλών εισαγωγικών και του χαρακτήρα \ (backslash). Οι ακολουθίες διαφυγής ξεκινούν με το χαρακτήρα \ (backslash) και περιγράφονται στον πίνακα που ακολουθεί. Παραδείγματα σταθερών χαρακτήρων είναι τα ακόλουθα: a G \n \t σελ. 3/14

Χαρακτήρας Περιγραφή \n χαρακτήρας αλλαγής γραμμής (line feed) \t χαρακτήρας στηλοθέτησης (TAB) \r χαρακτήρας επιστροφής στην αρχή της γραμμής \0 χαρακτήρας με ASCII κωδικό 0 \\ χαρακτήρας \ (backslash) \' χαρακτήρας ' (απλό εισαγωγικό) \" χαρακτήρας " (διπλό εισαγωγικό) Οι σταθερές συμβολοσειρές, που αποτελούνται από μια ακολουθία κοινών χαρακτήρων ή ακολουθιών διαφυγής μέσα σε διπλά εισαγωγικά. Οι συμβολοσειρές δεν μπορούν να εκτείνονται σε περισσότερες από μια γραμμές προγράμματος. Παραδείγματα σταθερών συμβολοσειρών είναι τα ακόλουθα: abc Route 66 Hello world!\n Name:\t\ Douglas Adams\ \nvalue:\t42\n Τους τελεστές, οι οποίοι είναι οι παρακάτω και η περιγραφή τους φαίνεται στον πίνακα που ακολουθεί: αριθμητικοί τελεστές: + - * / div mod σχεσιακοί τελεστές: -eq -gt -lt -dt -ge -le λογικοί τελεστές: and or not Τελεστής Περιγραφή div ακέραιο μέρος πηλίκου διαίρεσης mod υπόλοιπο διαίρεσης -eq ίσο με (=) -gt μεγαλύτερο από (>) -lt μικρότερο από (<) -dt διάφορο από ( ) -ge μεγαλύτερο ή ίσο με ( ) -le μικρότερο ή ίσο με ( ) and λογική σύζευξη or λογική διάζευξη not λογική άρνηση Οι τελεστές της γλώσσας MiX διακρίνονται σε τελεστές με ένα όρισμα και τελεστές με δύο ορίσματα. Οι τελεστές με ένα όρισμα γράφονται πριν από το όρισμα (prefix), ενώ εκείνοι με δύο ορίσματα γράφονται πάντα μεταξύ των ορισμάτων (infix). Η αποτίμηση των ορισμάτων των τελεστών με δύο ορίσματα γίνεται από αριστερά προς τα δεξιά. Στον πίνακα που ακολουθεί ορίζεται η προτεραιότητα και η προσεταιριστικότητα των τελεστών της MiX. Προηγούνται οι τελεστές που εμφανίζονται πιο ψηλά στον πίνακα. Όσοι τελεστές βρίσκονται στο ίδιο κελί έχουν την ίδια προτεραιότητα. σελ. 4/14

Τελεστές Αριθμός ορισμάτων Θέση και προσεταιριστικότητα + - 1 prefix not 1 prefix * / div mod and 2 infix, αριστερή + - or 2 infix, αριστερή -eq -gt -lt -le -ge -dt 2 infix Τους διαχωριστές, οι οποίοι είναι οι παρακάτω: := ;. ( ) :, [ ] } Η χρήση των διαχωριστών της γλώσσας MiX είναι αντίστοιχη με τη χρήση τους στη γλώσσα Pascal. Εκτός από τις λεκτικές μονάδες που προαναφέρθηκαν, ένα πρόγραμμα MiX μπορεί επίσης να περιέχει τα παρακάτω, τα οποία αγνοούνται: Κενούς χαρακτήρες, δηλαδή ακολουθίες αποτελούμενες από κενά διαστήματα (space), χαρακτήρες στηλοθέτησης (tab), χαρακτήρες αλλαγής γραμμής (line feed) ή χαρακτήρες επιστροφής στην αρχή της γραμμής (carriage return). Σχόλια, τα οποία αρχίζουν με την ακολουθία χαρακτήρων (* και τερματίζονται με την πρώτη μετέπειτα εμφάνιση της ακολουθίας χαρακτήρων *). Κατά συνέπεια, τα σχόλια δεν επιτρέπεται να είναι φωλιασμένα. Στο εσωτερικό τους επιτρέπεται η εμφάνιση οποιουδήποτε χαρακτήρα. Σχόλια γραμμής, το οποία αρχίζουν με τον χαρακτήρα # και εκτείνονται ως το τέλος της γραμμής. 2.2 Τύποι δεδομένων Η MiX υποστηρίζει τέσσερις βασικούς τύπους δεδομένων: integer: ακέραιοι αριθμοί, boolean: λογικές τιμές, char: χαρακτήρες, και real: πραγματικοί αριθμοί. Εκτός από τους βασικούς τύπους, η MiX υποστηρίζει επίσης τους παρακάτω σύνθετους τύπους, η κατασκευή των οποίων βασίζεται σε άλλους βασικούς: array [n] of t: πίνακες, αποτελούμενοι από n στοιχεία τύπου t. Το n θα πρέπει να είναι ακέραια σταθερά με θετική τιμή και το t έγκυρος βασικός τύπος. array [n] [k] of t: πολυδιάστατοι πίνακες, αποτελούμενοι από στοιχεία τύπου t. Τα n,..,k θα πρέπει να είναι ακέραιες σταθερές με σελ. 5/14

θετική τιμή και το t έγκυρος βασικός τύπος. Ένα παράδειγμα τρισδιάστατου πίνακα τύπου char είναι: array [10][4][20] of char array of t: πίνακες, αποτελούμενοι από άγνωστο αριθμό στοιχείων τύπου t. Το t πρέπει να είναι έγκυρος βασικός τύπος. 2.3 Δομή του προγράμματος Ένα πρόγραμμα MiX αποτελείται από τις οδηγίες προς τον μεταγλωττιστή και τις εντολές ορισμού (με οποιαδήποτε σειρά), την επικεφαλίδα και το σώμα της κύριας δομικής μονάδας. Οι οδηγίες προς το μεταγλωττιστή υπάρχουν προαιρετικά και συντάσσονται ως @include file_name.mix Οι εντολές ορισμού είναι επίσης προαιρετικές και έχουν τη μορφή @define variable constant Η επικεφαλίδα της κύριας δομικής μονάδας είναι της μορφής program p; όπου p το όνομα του προγράμματος. Το σώμα κάθε δομικής μονάδας μπορεί να περιέχει προαιρετικά: Δηλώσεις μεταβλητών. Ορισμούς υποπρογραμμάτων. Δηλώσεις υποπρογραμμάτων, οι ορισμοί των οποίων θα ακολουθήσουν. Τελευταίο συστατικό του σώματος μιας δομικής μονάδας είναι μια σύνθετη εντολή, η οποία καθορίζει τη λειτουργία της δομικής μονάδας. Στην περίπτωση της κυρίας δομικής μονάδας, η εκτέλεση του προγράμματος ξεκινά από αυτή τη σύνθετη εντολή. Το σώμα της κύριας δομικής μονάδας τελειώνει υποχρεωτικά με το διαχωριστή.. 2.3.1 Οδηγίες προς το μεταγλωττιστή Ο μεταγλωττιστής της γλώσσας MiX υποστηρίζει την οδηγία @include. Η οδηγία αυτή επιτρέπει την ανάγνωση ενός εξωτερικού αρχείου σαν αυτό να ήταν τμήμα του προγράμματος. Πρέπει να βρίσκεται υποχρεωτικά στην αρχή της γραμμής (να μην προηγούνται κενά διαστήματα). Η σύνταξή της είναι η εξής: @include file_name.mix Σε περίπτωση που κατά τη μεταγλώττιση του προγράμματος συναντήσετε αυτή την οδηγία, θα πρέπει να σταματήσετε την ανάγνωση του αρχείου προγράμματος και να συνεχίσετε με την επεξεργασία του αρχείου που ζητείται να συμπεριληφθεί. Μετά το τέλος αυτού του αρχείου, πρέπει να συνεχίσετε από το σημείο του αρχείου προγράμματος στο οποίο είχατε σταματήσει. Τα αρχεία που διαβάζονται με την οδηγία @include μπορούν να περιέχουν και αυτά τέτοιες οδηγίες. Φυσικά μεμονωμένες λεκτικές μονάδες καθώς και σχόλια πρέπει να περιέχονται πλήρως σε ένα αρχείο προγράμματος (δεν επιτρέπεται να αρχίζουν σε ένα αρχείο προγράμματος και να τελειώνουν σε κάποιο άλλο). 2.3.2 Μεταβλητές Οι δηλώσεις μεταβλητών γίνονται με τη λέξη κλειδί var. Ακολουθούν ένα ή περισσότερα ονόματα μεταβλητών και ένας τύπος δεδομένων. Περισσότερες σελ. 6/14

συνεχόμενες δηλώσεις μεταβλητών μπορούν να γίνουν παραλείποντας τη λέξη κλειδί var. Παραδείγματα δηλώσεων είναι: var i: integer; x, y: real; var s: array [80] of char; 2.3.3 Υποπρογράμματα Τα υποπρογράμματα διακρίνονται σε διαδικασίες (procedure) και συναρτήσεις (function). Κάθε υποπρόγραμμα είναι μια δομική μονάδα και αποτελείται από την επικεφαλίδα του και το σώμα του. Η δομή του σώματος έχει ήδη περιγραφεί. Στην επικεφαλίδα αναφέρεται κατ' αρχήν αν το υποπρόγραμμα είναι διαδικασία ή συνάρτηση, το όνομά του, οι παράμετροί του μέσα σε παρενθέσεις και, αν πρόκειται για συνάρτηση, ο τύπος του αποτελέσματος, ο οποίος μπορεί να είναι βασικός ή σύνθετος. Οι παρενθέσεις είναι υποχρεωτικές ακόμα και αν ένα υποπρόγραμμα δεν έχει παραμέτρους. Ακολουθούν παραδείγματα επικεφαλίδων συναρτήσεων. procedure p1 (); procedure p2 (n: integer); procedure p3 (a, b: integer; b: boolean); function f1 (x: real): real; function f2 (s: array of char): integer; function f3 (x: real): array [10] of real; 2.3.4 Εντολές Οι εντολές που υποστηρίζει η γλώσσα MiX είναι οι ακόλουθες: Η κενή εντολή, που δεν κάνει καμία ενέργεια. Η εντολή ανάθεσης v:= e. Τα v και e προσδιορίζονται όπως και στην Pascal. Η εντολή ανάθεσης result:= e σε περίπτωση που πρόκειται για συνάρτηση. Η λέξη κλειδί result επιστρέφει το αποτέλεσμα μιας συνάρτησης και εμφανίζεται υποχρεωτικά στη δομική μονάδα της συνάρτησης. Η σύνθετη εντολή, που αποτελείται από μια σειρά έγκυρων εντολών χωρισμένων με το διαχωριστή ; και βρίσκεται ανάμεσα στους διαχωριστές και }. Η εντολή ελέγχου if e then s 1 else s 2. Το τμήμα else είναι προαιρετικό. Το e είναι μια έκφραση που προσδιορίζεται όπως στην Pascal, ενώ τα s 1 και s 2 είναι έγκυρες εντολές. Οι εντολές βρόχου while e do s και repeat s until e. Τα e και s προσδιορίζονται όπως παραπάνω. Η εντολή με ετικέτα l:s, όπου l το όνομα μιας ετικέτας και s μια έγκυρη εντολή. σελ. 7/14

Η εντολή άλματος goto l, όπου l το όνομα μιας ετικέτας που πρέπει να εμφανίζεται στην ίδια δομική μονάδα. Πέραν αυτού, δεν υπάρχουν άλλοι περιορισμοί ως προς τη θέση των εντολών αλμάτων ή των ετικετών όπου αυτά οδηγούν. Η εντολή return, που επιστρέφει τερματίζοντας την εκτέλεση της δομικής μονάδας. 3. Παραδείγματα προγραμμάτων της MiX 3.1 Hello World! Το παρακάτω αποτελεί το πιο απλό πρόγραμμα στη γλώσσα MiX. Καλή αρχή! program hello; }. writestring( Hello World!\n ) σελ. 8/14

3.2 Φωλιασμένες διαδικασίες Το παρακάτω παράδειγμα είναι ένα πρόγραμμα για να καταλάβετε τη σύνταξη δομικών μονάδων στη γλώσσα MiX. @include input.mix @define N 100 @include output.mix program useless; var i, k: integer; procedure add(n: integer, k:integer); var j: integer; function cube(i: integer): integer; result:= i * i * i; return j:= N - n + cube(k); writeinteger(j) (* Here you can see some useless lines. ** Just for testing the multi-line comments *) k:= readinteger(); i:= readinteger(); add(k,i) #Here you can see some dummy comments! }. σελ. 9/14

3.3 Πρώτοι αριθμοί Το παρακάτω παράδειγμα είναι ένα πρόγραμμα στη γλώσσα MiX που υπολογίζει τους πρώτους αριθμούς μεταξύ 1 και n, όπου το n καθορίζεται από το χρήστη. program calculate; function prime(n: integer): boolean; var i : integer; isprime: boolean; if n -lt 0 then result:= prime(-n) else if n -lt 2 then result:= false else if n -eq 2 then result:= true else if n mod 2 -eq 0 then result:= false else i:= 3; isprime:= true; while isprime and (i -le n div 2) do isprime:= n mod i -eq 0; i:= i+2; result:= isprime return var limit, number, counter: integer; limit:= readinteger(); counter:= 0; if limit -ge 2 then counter:= counter + 1; writeinteger(2); if limit -ge 3 then counter:= counter + 1; writeinteger(3) number:= 4; while number -le limit do if prime(number) then counter := counter + 1; writeinteger(number) number:= number + 1 writechar( \n ); writeinteger(counter) }. σελ. 10/14

4. Αναλυτική περιγραφή εργασίας 4.1 Τα εργαλεία Για να ολοκληρώσετε επιτυχώς την εργασία του μαθήματος χρειάζεται να γνωρίζετε καλά προγραμματισμό σε C, flex και bison. Τα εργαλεία flex και bison έχουν αναπτυχθεί από το πρόγραμμα GNU και μπορείτε να τα βρείτε σε όλους τους κόμβους του διαδικτύου που διαθέτουν λογισμικό GNU (π.χ., στον κόμβο http://www.gnu.org/). Στο λειτουργικό linux (οποιαδήποτε διανομή) τα εργαλεία αυτά είναι ενσωματωμένα, οπότε δεν χρειάζεται να κατεβάσετε ή να εγκαταστήσετε κάτι! Τα manuals των εργαλείων μπορείτε να τα κατεβάσετε από την σελίδα του μαθήματος. Επίσης, θα γίνουν και φροντιστήρια των οποίων οι σημειώσεις θα αναρτηθούν ηλεκτρονικά. 4.2 1 η φάση: Λεκτική ανάλυση Το παραδοτέο για την φάση της λεκτικής ανάλυσης θα είναι ένα πρόγραμμα το οποίο θα παίρνει σαν είσοδο ένα αρχείο της γλώσσας MiX και θα αναγνωρίζει τα tokens που διαβάζει στο αρχείο αυτό. Η έξοδός του θα είναι μία λίστα από τα tokens που διάβασε και ο χαρακτηρισμός τους. Για παράδειγμα για input var i: integer; το output του προγράμματός σας θα πρέπει να είναι Read token VAR Read token ID Read token COLON Read token INT Read token SEMICLN Σε περίπτωση λανθασμένης εισόδου (π.χ., ένα μη έγκυρο αναγνωριστικό) τυπώνεται κατάλληλο μήνυμα λάθους. Για να φτιάξετε ένα λεκτικό αναλυτή θα χρησιμοποιήσετε το εργαλείο flex και τον compiler gcc. Σε ένα terminal στο linux γράψτε man flex και θα δείτε το manual του flex με πολλά παραδείγματα. Τα αρχεία με κώδικα του flex έχουν προέκταση.l. Για να κάνετε compile και να τρέξετε τον κώδικά σας ακολουθήστε τις οδηγίες που δίνονται παρακάτω (το παράδειγμα είναι για περιβάλλον linux). 1. Γράψτε τον κώδικα flex και αποθηκεύστε τον σε ένα αρχείο με προέκταση.l, π.χ. mylexer.l. 2. Για να κάνετε compile, σε ένα terminal (στην γραμμή εντολής) γράψτε flex mylexer.l. Η εντολή αυτή θα δημιουργήσει ένα αρχείο της C. 3. Κάντε ls για να δείτε αν υπάρχει το αρχείο lex.yy.c. To αρχείο αυτό παράγεται από τον flex. σελ. 11/14

4. Στην συνέχεια πρέπει να κάνετε compile to.c αρχείο που δημιουργήθηκε (δηλαδή το αρχείο lex.yy.c ) με την εντολή gcc -o mycompiler lex.yy.c lfl 5. Αν έχετε κάνει λάθη στο mylexer.l θα τα δείτε τώρα, αλλιώς παράγεται το εκτελέσιμο αρχείο mycompiler. 6. Για να το τρέξετε γράψτε./mycompiler < example.mix, όπου example.mix είναι ένα πρόγραμμα στην γλώσσα MiX. Κάθε φορά που αλλάζετε το mylexer.l θα πρέπει να κάνετε όλη την διαδικασία από την αρχή δηλαδή: flex mylexer.l gcc -o mycompiler lex.yy.c -lfl./compiler < example.mix Επομένως είναι καλή ιδέα να φτιάξετε ένα makefile για να κάνει τα παραπάνω. Κώδικα σε MiX θα πρέπει να γράψετε εσείς. Για αρχή μπορείτε να χρησιμοποιήσετε ένα από τα παραδείγματα που σας δίνουμε. Αυτά όμως δεν είναι πλήρη, αφού υπάρχουν και άλλες περιπτώσεις που θα πρέπει να καλύψετε διαβάζοντας την εκφώνηση του project. Είναι δική σας ευθύνη να αναδείξετε τη δουλειά που έχετε κάνει μέσα από τα προγράμματα σε MiX που θα δείχνουν τι περιπτώσεις αναγνωρίζετε. Το παραδοτέο για την φάση αυτή πρέπει να παραδοθεί ως ένα συμπιεσμένο αρχείο ονομασμένο με τα ονόματα της ομάδας σας (π.χ., tryfonopoulos_raftopoulou.zip) και να αποσταλεί επισυναπτόμενο με e-mail στη διεύθυνση theory@intelligence.tuc.gr με subject FASH A. To αρχείο αυτό θα πρέπει να περιέχει τα παρακάτω αρχεία: mylexer.l: To αρχείο flex. readme.txt: Το αρχείο αυτό θα περιέχει τα ονόματα σας και τον αριθμό μητρώου σας. Επιπλέον θα πρέπει να περιέχει άλλη μια παράγραφο που συνοπτικά θα περιγράφει ποια λάθη πιάνει το κάθε ένα από τα wrong αρχεία που στέλνετε ή ότι άλλη πληροφορία θέλετε εσείς να ξέρουμε. correct1.mix, correct2.mix, : Αρχεία της γλώσσας MiX τα οποία θα είναι σωστά και θα περιέχουν μόνο ότι δουλεύει σωστά με τον δικό σας compiler. wrong1.mix, wrong2.mix,...: Αρχεία της γλώσσας MiX τα οποία θα έχουνε λάθη και με αυτά τα αρχεία ουσιαστικά μας δείχνετε τι λάθη έχετε πιάσει. Θα πρέπει να στείλετε τουλάχιστον 5 τέτοια αρχεία (δεδομένου ότι κάθε αρχείο θα μπορεί να έχει μόνο ένα λάθος, αφού το πρόγραμμα τερματίζει στο πρώτο λάθος που θα συναντήσει). 4.3 2 η φάση: Συντακτική ανάλυση Το παραδοτέο για την φάση της συντακτικής ανάλυσης θα είναι ένα πρόγραμμα το οποίο θα παίρνει σαν είσοδο ένα αρχείο της γλώσσας MiX και θα αναγνωρίζει αν αυτό το πρόγραμμα ακολουθεί τους συντακτικούς κανόνες της MiX. Η έξοδός του θα είναι ένα μήνυμα ότι το πρόγραμμα που δόθηκε είναι συντακτικά σωστό ή διαφορετικά οι αριθμοί των γραμμών του αρχείου που υπάρχουν κάποια λάθη. σελ. 12/14

Για να φτιάξετε ένα συντακτικό αναλυτή θα χρησιμοποιήσετε το εργαλείο bison και τον compiler gcc. Σε ένα terminal στο linux γράψτε man bison και θα δείτε το manual του bison με πολλά παραδείγματα. Τα αρχεία με κώδικα του bison έχουν προέκταση.y. Για να κάνετε compile και να τρέξετε τον κώδικά σας ακολουθήστε τις οδηγίες που δίνονται παρακάτω (το παράδειγμα είναι για περιβάλλον linux). 1. Υποθέτουμε ότι έχετε ήδη έτοιμο τον λεκτικό αναλυτή και αποθηκευμένο στο αρχείο mylexer.l. 2. Γράψτε τον κώδικα bison και αποθηκεύστε τον σε ένα αρχείο με προέκταση.y, π.χ. myanalyzer.y. 3. Για να ενώσετε το flex με το bison πρέπει να κάνετε τα εξής: a. Tα αρχεία mylexer.l και myanalyzer.y πρέπει να είναι στο ίδιο directory. b. Θα βγάλετε την συνάρτηση main από το flex αρχείο και θα φτιάξετε μια main στο bison αρχείο. Για αρχή το μόνο που χρειάζεται να κάνει η main είναι να καλεί μια φορά την μακροεντολή του bison yyparse(). H yyparse() τρέχει συνεχώς την yylex() και προσπαθεί να αντιστοιχίσει κάθε token που επιστρέφει o λεκτικός αναλυτής στη γραμματική που έχετε γράψει στον συντακτικό αναλυτή. Επιστρέφει 0 για επιτυχή τερματισμό και 1 για λανθασμένο τερματισμό. c. Θα αφαιρέσετε τα defines που είχατε κάνει για τα tokens στο flex ή σε κάποιο άλλο.h αρχείο. Αυτά θα δηλωθούν τώρα στο bison αρχείο ένα σε κάθε γραμμή με την εντολή %token. Όταν κάνετε compile to myanalyzer.y θα δημιουργείται αυτόματα ένα αρχείο με όνομα myanalyzer.tab.h. To αρχείο αυτό θα πρέπει να το κάνετε include στο αρχείο mylexer.l και έτσι ο flex θα καταλαβαίνει τα ίδια tokens με τoν bison. 4. Για να κάνετε compile bison -d myanalyzer.y flex mylexer.l gcc -o mycompiler lex.yy.c myanalyzer.tab.c -lfl./compiler <test.mix Προσοχή! Το bison παράγει και ένα.c αρχείο το myanalyzer.tab.c. Πρέπει να κάνετε πρώτα compile το αρχείο myanalyzer.y και μετά το mylexer.l γιατί το αρχείο myanalyzer.tab.h το κάνετε include στο mylexer.l. Κάθε φορά που αλλάζετε το mylexer.l και myanalyzer.y θα πρέπει να κάνετε όλη την διαδικασία από την αρχή. Οπότε είναι καλή ιδέα να φτιάξετε ένα makefile για να κάνει τα παραπάνω. Το παραδοτέο για την φάση αυτή πρέπει να παραδοθεί ως ένα συμπιεσμένο αρχείο ονομασμένο με τα ονόματα της ομάδας σας (π.χ., tryfonopoulos_raftopoulou.zip) και να αποσταλεί επισυναπτόμενο με e-mail στη διεύθυνση theory@intelligence.tuc.gr με subject FASH B. σελ. 13/14

To αρχείο αυτό θα πρέπει να περιέχει τα παρακάτω αρχεία: mylexer.l: To αρχείο flex. myanalyzer.y: To αρχείο bison. readme.txt: Το αρχείο αυτό θα περιέχει τα ονόματα σας και τον αριθμό μητρώου σας. Επιπλέον θα πρέπει να περιέχει άλλη μια παράγραφο που συνοπτικά θα περιγράφει ποια λάθη πιάνει το κάθε ένα από τα wrong αρχεία που στέλνετε ή ότι άλλη πληροφορία θέλετε εσείς να ξέρουμε. correct1.mix, correct2.mix, : Αρχεία της γλώσσας MiX τα οποία θα είναι σωστά και θα περιέχουν μόνο ότι δουλεύει σωστά με τον δικό σας compiler. wrong1.mix, wrong2.mix,...: Αρχεία της γλώσσας MiX τα οποία θα έχουνε λάθη και με αυτά τα αρχεία ουσιαστικά μας δείχνετε τι λάθη έχετε πιάσει. Θα πρέπει να στείλετε τουλάχιστον 5 τέτοια αρχεία (δεδομένου ότι κάθε αρχείο θα μπορεί να έχει μόνο ένα λάθος). Ένα text αρχείο με το όνομα grammar.txt όπου θα δίνετε την γραμματική χωρίς συμφραζόμενα που χρησιμοποιήσατε. Μια αναλυτική αναφορά, η οποία θα καλύπτει την εργασία στο σύνολό της και θα αναλύει τις τεχνικές που χρησιμοποιήθηκαν ή τις ιδιαιτερότητες της εργασίας σας. Για τις αναφορές σας θα πρέπει να χρησιμοποιήσετε κάποιο κειμενογράφο (Microsoft Word, LaTeX κλπ.) για να γίνουν δεκτές. Οι αναφορές δεν πρέπει να περιλαμβάνουν εκτύπωση του κώδικα! Κώδικα σε MiX θα πρέπει να γράψετε εσείς. Για αρχή μπορείτε να χρησιμοποιήσετε ένα από τα παραδείγματα που σας δίνουμε. Αυτά όμως δεν είναι πλήρη, αφού υπάρχουν και άλλες περιπτώσεις που θα πρέπει να καλύψετε διαβάζοντας την εκφώνηση του project. Είναι δική σας ευθύνη να αναδείξετε τη δουλειά που έχετε κάνει μέσα από τα προγράμματα σε MiX που θα δείχνουν τι περιπτώσεις αναγνωρίζετε. 5. Επίλογος Στη διάρκεια του εξαμήνου θα δοθούν και πολλές διευκρινίσεις και αναλυτικά παραδείγματα μεταγλώτισσης. Να παρακολουθείτε τις παραδόσεις, τις ασκήσεις και την ιστοσελίδα του μαθήματος. Οι απορίες σας καλό είναι να στέλνονται στην λίστα του μαθήματος για να τις βλέπουν και οι συνάδελφοί σας. Καλή επιτυχία! σελ. 14/14