Εθνικό Μετσόβιο Πολυτεχνείο. Αυξητική Λεκτική και Συντακτική Ανάλυση

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Εθνικό Μετσόβιο Πολυτεχνείο. Αυξητική Λεκτική και Συντακτική Ανάλυση"

Transcript

1 Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών Αυξητική Λεκτική και Συντακτική Ανάλυση ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΣΠΥΡΟΣ ΧΑΤΖΗΧΡΙΣΤΟΔΟΥΛΟΥ Επιβλέπων : Νικόλαος Σ. Παπασπύρου Επίκ. Καθηγητής Ε.Μ.Π. Αθήνα, Ιούλιος 2009

2

3 Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών Αυξητική Λεκτική και Συντακτική Ανάλυση ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΣΠΥΡΟΣ ΧΑΤΖΗΧΡΙΣΤΟΔΟΥΛΟΥ Επιβλέπων : Νικόλαος Σ. Παπασπύρου Επίκ. Καθηγητής Ε.Μ.Π. Εγκρίθηκε από την τριμελή εξεταστική επιτροπή την 1η Ιουλίου Νικόλαος Παπασπύρου Επίκ. Καθηγητής Ε.Μ.Π Κωστής Σαγώνας Αν. Καθηγητής Ε.Μ.Π Στάθης Ζάχος Καθηγητής Ε.Μ.Π. Αθήνα, Ιούλιος 2009

4 Σπύρος Χατζηχριστοδούλου Διπλωματούχος Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών Ε.Μ.Π. Copyright c Σπύρος Χατζηχριστοδούλου, Με επιφύλαξη παντός δικαιώματος. All rights reserved. Απαγορεύεται η αντιγραφή, αποθήκευση και διανομή της παρούσας εργασίας, εξ ολοκλήρου ή τμήματος αυτής, για εμπορικό σκοπό. Επιτρέπεται η ανατύπωση, αποθήκευση και διανομή για σκοπό μη κερδοσκοπικό, εκπαιδευτικής ή ερευνητικής φύσης, υπό την προϋπόθεση να αναφέρεται η πηγή προέλευσης και να διατηρείται το παρόν μήνυμα. Ερωτήματα που αφορούν τη χρήση της εργασίας για κερδοσκοπικό σκοπό πρέπει να απευθύνονται προς τον συγγραφέα. Οι απόψεις και τα συμπεράσματα που περιέχονται σε αυτό το έγγραφο εκφράζουν τον συγγραφέα και δεν πρέπει να ερμηνευθεί ότι αντιπροσωπεύουν τις επίσημες θέσεις του Εθνικού Μετσόβιου Πολυτεχνείου.

5 Περίληψη Σκοπός της διπλωματικής αυτής εργασίας είναι η μελέτη των προτεινομένων από την βιβλιογραφία αλγορίθμων που αφορούν την αυξητική λεκτική και συντακτική ανάλυση προγραμμάτων, καθώς αυτά διαμορφώνονται μέσα σε επεξεργαστές κειμένων. Η χρησιμότητα του αυξητικού χαρακτήρα των αλγορίθμων αυτών είναι μεγάλη για επεξεργαστές κειμένων, όπου ο προγραμματιστής θέλει να έχει αναλυτικές πληροφορίες για τυχόν συντακτικά λάθη που εμφανίζονται στον κώδικά του, καθώς τον αναπτύσσει. Με τον τρόπο αυτό είναι δυνατόν να αποφευχθεί αναλυτική αποσφαλμάτωση (debugging) για την εύρεση κάποιου συντακτικού λάθους σε περιπτώσεις όπου το μέγεθος του κώδικα είναι πολύ μεγάλο, και η διαδικασία αυτή καταναλώνει πολύτιμες ανθρωποώρες. Παρουσιάζονται και μελετούνται αλγόριθμοι που θεωρητικά είναι βέλτιστοι ως προς το χρόνο εκτέλεσης και το χώρο που απαιτούν για την ανάλυση του αλλαγμένου κειμένου, καθώς και μια εντελώς νέα, συναρτησιακή προσέγγιση στο θέμα της αυξητικής συντακτικής ανάλυσης. Λέξεις κλειδιά Λεκτικός αναλυτής, συντακτικός αναλυτής, αυξητική λεκτική ανάλυση, αυξητική συντακτική ανάλυση, οκνηρή συναρτησιακή αυξητική συντακτική ανάλυση, επεξεργαστής κειμένου. 5

6

7 Abstract The aim of this paper is to study algorithms for incremental scanning and parsing of programs, while they are being shaped in text editors. These algorithms are very important for text editors, where the programmer wants to have analytical information about potential syntactic errors that may appear on their code, while it s being developed. This way, it s possible to avoid thorough debugging for finding a syntactic error in cases that the size of the code is very large, and this process consumes vital man-hours. Algorithms theoretically optimal in time of execution and space needed for analyzing the changed text, and a brand-new, functional approach to the subject of incremental parsing, are being presented and studied. Key words Lexical analyzer, parser, incremental scanning, incremental parsing, lazy functional incremental parsing, text editor. 7

8

9 Ευχαριστίες Ευχαριστώ την οικογένεια, και κυρίως τους γονείς μου, που βρίσκονταν πάντα στο πλάι μου σε όλη τη διάρκεια της ακαδημαϊκής μου πορείας στο Εθνικό Μετσόβιο Πολυτεχνείο, τον καθηγητή μου κ. Παπασπύρου, που στα χρόνια τα οποία τον γνωρίζω ήταν μια συνεχής πηγή στήριξης και έμπνευσης για μένα, και όλα τα μέλη του Εργαστηρίου Τεχνολογίας Λογισμικού του Ε.Μ.Π. που πάντα έλυναν κάθε είδους απορία που εμφανιζόταν. Σπύρος Χατζηχριστοδούλου, Αθήνα, Ιουλίου Η εργασία αυτή είναι επίσης διαθέσιμη ως Τεχνική Αναφορά CSD-SW-TR-2-09, Εθνικό Μετσόβιο Πολυτεχνείο, Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών, Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών, Εργαστήριο Τεχνολογίας Λογισμικού, Ιούλιος URL: FTP: ftp://ftp.softlab.ntua.gr/pub/techrep/ 9

10

11 Περιεχόμενα Περίληψη Abstract Ευχαριστίες Περιεχόμενα Εισαγωγή Σκοπός Διαρύθμιση Κεφαλαίων Γενικά Γλώσσες Προγραμματισμού Τυπικές Γραμματικές Λεκτική Ανάλυση Συντακτική Ανάλυση Γενικά Η top-down Μέθοδος Η bottom-up Μέθοδος Η Γλώσσα Προγραμματισμού Minibasic Το πρόγραμμα επεξεργασίας κειμένου Meddle Το πρόγραμμα επεξεργασίας κειμένου Yi Η πρώτη ιδέα Ο αλγόριθμος Jalili-Galier Η μέθοδος Beetem-Beetem Το εγχείρημα Harmonia Καταγράφοντας τις αλλαγές στον Text Buffer Γενικά Η δομή kmn-list Διαχείριση αλλαγών στο text buffer Εισαγωγές χαρακτήρων στο text buffer Διαγραφές χαρακτήρων από το text buffer Σχόλια για την Πολυπλοκότητα των Αλγορίθμων 1 και Αυξητική Λεκτική Ανάλυση Γενικά Ταυτοποίηση λεκτημάτων Ο αλγόριθμος αυξητικής λεκτικής ανάλυσης Η συνάρτηση INC-SCAN Η συνάρτηση KMN-MOVE

12 5.4 Σχόλια για την πολυπλοκότητα των Αλγορίθμων 3 και Αυξητική Συντακτική Ανάλυση Γενικά Η δομή δεδομένων P-Tree Ο αυξητικός συντακτικός αναλυτής Γενικά Υλοποίηση του αυξητικού συντακτικού αναλυτή Επαναχρησιμοποίηση Δέντρων Μεταφέροντας τις Αλλαγές στο Ρεύμα Λεκτημάτων Ο αλγόριθμος Αυξητικής Συντακτικής Ανάλυσης Οι Αυξητικές Μέθοδοι στον Επεξεργαστή Κειμένου Meddle Απόδοση Εφαρμογή των Μεθόδων Αυξητικής Λεκτικής και Συντακτικής Ανάλυσης Συναρτησιακή Αυξητική Λεκτική και Συντακτική Ανάλυση Οκνηρή Αποτίμηση και Αυξητική Συντακτική Ανάλυση Οκνηρή Αποτίμηση Η Οκνηρή Αποτίμηση ως Μέσο για Επίτευξη Αυξητικής Συντακτικής Ανάλυσης Στόχοι Διαπροσωπεία και Προοπτική Κύρια Επανάληψη της Διαδικασίας (Main Loop) Παράγοντας τα Αποτελέσματα Είσοδος Έξοδος Προσθέτοντας Είσοδο Γενικά Περνώντας σε Πολωνική Μορφή Προσθέτοντας Επιλογή Γενικά Διόρθωση Σφαλμάτων Παράδειγμα Ο Αλγόριθμος Οκνηρής Συναρτησιακής Αυξητικής Συντακτικής Ανάλυσης Απολογισμός Αλγορίθμου Αραιοποίηση Αποτελεσμάτων Απαλοίφοντας την Γραμμική Συμπεριφορά Αποτελέσματα Γενικά Πολυπλοκότητα Συμπέρασμα Σύγκριση Μεθόδων Βιβλιογραφία

13 Κεφάλαιο 1 Εισαγωγή 1.1 Σκοπός Η ανάγκη των προγραμματιστών στις μέρες μας για συνεχή παροχή πληροφοριών αναφορικά με την λεκτική και συντακτική δομή των προγραμμάτων τους έχει αυξηθεί κατακόρυφα. Αυτό οφείλεται κυρίως στο ότι οι γλώσσες προγραμματισμού που χρησιμοποιούνται για την ανάπτυξη (διαδικτυακών κυρίως) εφαρμογών (Java, C#, Visual Basic) απαιτούν την συγγραφή χιλιάδων γραμμών κώδικα για την περιγραφή των αντικειμένων που μοντελοποιούν κάθε πρόβλημα και των μεθόδων τους. Ο κάθε προγραμματιστής επιθυμεί διαρκώς να έχει πληροφορίες για την κατάσταση των λεκτημάτων που βρίσκονται στο ρεύμα εισόδου στον μεταγλωττιστή που χρησιμοποιεί, καθώς και για την κατάσταση του Αφηρημένου Δέντρου Σύνταξης (Abstract Syntax Tree - AST) που δημιουργείται κατά την φάση της συντακτικής ανάλυσης του προγράμματός του. Τέτοιες πληροφορίες είναι εξαιρετικά χρήσιμες, αφού οποιαδήποτε αναφορά σφάλματος στην φάση της λεκτικής ανάλυσης για παράδειγμα, θα γλυτώσει τον προγραμματιστή από χρονοβόρα μεταγλώττιση και ακόμα πιο χρονοβόρα αποσφαλμάτωση του προγράμματος. Είναι φανερό ότι για να προσφέρουμε στον χρήστη κάποιου επεξεργαστή κειμένου τέτοιες πληροφορίες, χρειάζεται συνεχής λεκτικός και συντακτικός έλεγχος του (μέχρι τη συγκεκριμένη χρονική στιγμή αναπτυγμένου) προγράμματος. Έτσι, εμφανίστηκε γύρω στα 1970 η ανάγκη για τους πρώτους λεκτικούς και συντακτικούς αναλυτές με αυξητικό χαρακτήρα. Δηλαδή αναζητήθηκαν μέθοδοι και αλγόριθμοι συνεχούς λεκτικού και συντακτικού ελέγχου του προγράμματος κατά τη διάρκεια της ανάπτυξής του. Προφανώς οι υπάρχοντες αλγόριθμοι δε θα μπορούσαν να χρησιμοποιηθούν, αφού αφενός όταν το πρόγραμμα είναι ημιτελές θα αναφέρουν συνέχεια συντακτικά σφάλματα, ενώ αφεταίρου όταν το πρόγραμμα είναι ολοκληρωμένο και ο χρήστης εκτελεί αλλαγές σ αυτό, θα χρειάζεται η λεκτική και η συντακτική ανάλυσή του από την αρχή με κάθε αλλαγή, γεγονός που σίγουρα θα οδηγήσει σε λύσεις μη συμφέρουσες χρονικά. Σκοπός της εργασίας αυτής είναι η παρουσίαση, μελέτη, σύγκριση και επέκταση των διαφόρων αλγορίθμων αυξητικής λεκτικής και συντακτικής ανάλυσης που έχουν προταθεί μέχρι τώρα στη βιβλιογραφία. Συγκεκριμένα εξετάζονται οι επεξεργαστές κειμένου Meddle και Yi, στους οποίους έχουν ενσωματωθεί υλοποιημένοι αλγόριθμοι αυξητικής λεκτικής και συντακτικής ανάλυσης βασισμένοι στους γνωστούς σειριακούς αλγόριθμους στον πρώτο, και σε μια εντελώς νέα, οκνηρή, συναρτησιακή προσέγγιση στον δεύτερο. 1.2 Διαρύθμιση Κεφαλαίων Κεφάλαιο 2. Περιγράφονται οι βασικές έννοιες που θα χρησιμοποιηθούν σε όλη τη διάρκεια της παρούσας εργασίας. Γίνεται μια εισαγωγή στις γλώσσες προγραμματισμού και τις τυπικές γραμματικές, τις φάσεις της λεκτικής και συντακτικής ανάλυσης, και περιγράφεται η πειραματική γλώσσα προγραμματισμού MiniBasic που θα χρησιμοποιηθεί σαν παράδειγμα για την μελέτη των δύο προσεγγίσεων που προαναφέρθηκαν. Κεφάλαιο 3. Γίνεται μια ιστορική αναδρομή σε όλες τις δουλειές που έγιναν μέχρι τώρα στον τομέα 13

14 αυτό ανά τω παγκόσμιω, και ειδικά στο εγχείριμα Harmonia του πανεπιστημίου του Berkeley που ενέπνευσε πολλές από τις μεταγενέστερες προσπάθειες. Κεφάλαιο 4. Περιγράφεται η δομή της kmn-list που χρησιμοποιείται για την αποτελεσματική καταγραφή των αλλαγών που κάνει ο χρήστης στο πρόγραμμα, καθώς και οι αλγόριθμοι που επινοήθηκαν για το σκοπό αυτό. Κεφάλαιο 5. Γίνεται μια αναλυτική περιγραφή του τρόπου με τον οποίο τα λεκτήματα που χρειάζονται επανανίχνευση ταυτοποιούνται, και περιγράφεται ο γενικευμένος αλγόριθμος αυξητικής λεκτικής ανάλυσης που είναι ουσιαστικά μια τροποποίηση των υπαρχόντων αλγορίθμων με σκοπό την απόκτηση αυξητικού χαρακτήρα. Κεφάλαιο 6. Περιγράφεται η δομή δεδομένων P-Tree, στην οποία στηρίζεται η υλοποίηση του αυξητικού συντακτικού αναλυτή, και γίνεται εκτενής αναφορά στις μεθόδους επαναχρησιμοποίησης συντακτικών δέντρων και μεταφοράς των αλλαγών στο ρεύμα λεκτημάτων. Κεφάλαιο 7. Μελετάται η τροποποίηση του επεξεργαστή κειμένου Meddle ώστε να αναγνωρίζει και να εκτελεί τις αυξητικές μεθόδους που παρουσιάστηκαν στα προηγούμενα δύο κεφάλαια σε προγράμματα γραμμένα σε MiniBasic, και παρουσιάζοντα τα προβλήματα που προέκυψαν κατά τη μελέτη αυτή. Κεφάλαιο 8. Περιγράφεται η εντελώς νέα οκνηρή, συναρτησιακή προσέγγιση στο θέμα της αυξητικής συντακτικής ανάλυσης. Γίνεται μια γενική αναφορά στον τρόπο με τον οποίο ο επεξεργαστής κειμένου Yi εκτελεί τις μεθόδους που περιγράφονται, και παρουσιάζονται εκτενώς οι διάφοροι συνδυαστές και κατασκευαστές που επινοήθηκαν στην γλώσσα προγραμματισμού Haskell για την υλοποίησή τους. Κεφάλαιο 9. Γίνεται μια γενική συμπερασματική αναφορά στις διάφορες μεθόδους αυξητικής λεκτικής και συντακτικής ανάλυσης που μελετήθηκαν, και περιγράφονται τα πλεονεκτήματα/μειονεκτήματά τους. 14

15 Κεφάλαιο 2 Γενικά 2.1 Γλώσσες Προγραμματισμού Από την δεκαετία του 1940, οπότε και εμφανίστηκαν οι πρώτοι ηλεκτρονικοί υπολογιστές των οποίων ο προγραμματισμός γινόταν σε γλώσσα μηχανής (δηλαδή ακολουθίες από 0 και 1) από τον ίδιο τον προγραμματιστή, μέχρι και σήμερα, έχουν αλλάξει πάρα πολλά στον τομέα των Γλωσσών Προγραμματισμού. Η μεγαλύτερη αλλαγή στον τομέα αυτό έγινε με την πρόταση από τον Ουγγροαμερικανό μαθηματικό John Von Neumann στα 1945 του μοντέλου που τελικά πήρε τ όνομά του, και σε γενικές γραμμές αναφέρει την χρήση μιας κοινής δομής (της μνήμης) για αποθήκευση τόσο των εντολών όσο και τον δεδομένων των προγραμμάτων. Η ιδέα αυτή έφερε πραγματική επανάσταση στην Πληροφορική, αφού η ιδέα του προγραμματισμού με το χέρι των γιγαντιαίων υπολογιστικών συστημάτων που υπήρχαν τότε άρχισε να δίνει τη θέση της στην έρευνα για Γλώσσες Προγραμματισμού, δηλαδή για ευκολότερους μνημονικά τρόπους να γράφει κάποιος προγράμματα. Ενδεικτικό είναι το γεγονός ότι γλώσσες προγραμματισμού που αναπτύχθηκαν στην δεκαετία του 1950 (π.χ. Fortran) συνεχίζουν να έχουν χρήση ακόμα και σήμερα, 60 χρόνια μετά. Μέχρι σήμερα έχουν δημιουργηθεί μερικές χιλιάδες γλώσσες προγραμματισμού. Αυτές μπορούν να κατηγοριοποιηθούν με διάφορους τρόπους. Ένας από αυτούς είναι ανάλογα με την γενιά στην οποία ανήκουν: Πρώτης Γενιάς: Γλώσσες μηχανής (machine languages), οι ακολουθίες από 0 και 1 στις οποίες έγραφαν οι προγραμματιστές στους πρώτους ηλεκτρονικούς υπολογιστές Δεύτερης Γενιάς: Συμβολικές γλώσσες (assembly languages), οι γλώσσες στις οποίες σήμερα μεταφράζονται από τους μεταγλωττιστές τα προγράμματα που γράφουν οι προγραμματιστές για να εκτελεστούν από το υλικό Τρίτης Γενιάς: Γλώσσες υψηλότερου επιπέδου (higher-level languages), οι οποίες έχουν ευρύτατη χρήση κυρίως στον προγραμματισμό λειτουργικών συστημάτων και διαδικτυακών εφαρμογών (Fortran, Cobol, Lisp, C, C++, C#, Java) Τέταρτης Γενιάς: Γλώσσες ειδικών σκοπών, όπως τις NOMAD (για αυτόματη δημιουργία αναφορών), SQL (για ερωτήματα σε βάσεις δεδομένων) και Postscript (για διαμόρφωση κειμένου) Πέμπτης Γενιάς: Γλώσσες βασισμένες στην λογική και τους περιορισμούς (logic and constrain based languages), όπως την Prolog και την OPS5 Μία άλλη κατηγοριοποίηση είναι σύμφωνα με το προγραμματιστικό μοντέλο στο οποίο κάποιος μπορεί να γράψει τα προγράμματά του σε κάθε γλώσσα: Προστακτικές: Στα προγράμματα γραμμένα σε προστακτικές (imperative) γλώσσες περιγράφεται πώς πρέπει να γίνει ένας υπολογισμός (C, C++, C#, Java) Δηλωτικές: Στα προγράμματα γραμμένα σε δηλωτικές (declarative) γλώσσες περιγράφεται ποιός υπολογισμός πρέπει να γίνει Συναρτησιακές: Τα προγράμματα σε συναρτησιακές γλώσσες μοιάζουν πολύ περισσότερο με μαθηματικές συναρτήσεις, και ακολουθούν το μοντέλο του λάμβδα λογισμού (Haskell, διάλεκτοι της ML και της Lisp) Λογικής Περιορισμών: Οι γλώσσες λογικής περιορισμών (logic constraints) ακολουθούν το μοντέλο 15

16 της πρωτοβάθμιας λογικής, και τα προγράμματά τους απαρτίζονται από λογικούς κανόνες (Prolog) Αντικειμενοστρεφείς: Στις αντικειμενοστρεφείς (Object Oriented) γλώσσες σημαίνων ρόλο έχουν έννοιες όπως κληρονομικότητα (inheritance), ενθυλάκωση (encapsulation), απόκρυψη πληροφορίας (information hiding), και τα προγράμματα αποτελούνται από αντικείμενα που αλληλεπιδρούν μεταξύ τους (Simula 67, Smalltalk, C++, C#, Java) Γλώσσες Σεναρίων: Οι γλώσσες σεναρίων (scripting languages) είναι γλώσσες προγραμματισμού οι οποίες συνοδεύονται από διερμηνείς (interpreters) και τελεστές υψηλού επιπέδου, και είναι σχεδιασμένες για να κολλούν μεταξύ τους υπολογισμούς, καλούμενους ως σενάρια (AWK, JavaScript, Perl, PHP, Python, Ruby, TCL) 2.2 Τυπικές Γραμματικές Οι Τυπικές Γραμματικές είναι πολύ χρήσιμες στην σχεδίαση μεταγλωττιστών. Από αυτές, (όπως θα δούμε στις επόμενες παραγράφους) χρησιμοποιούμε κανονικές εκφράσεις στην φάση της λεκτικής ανάλυσης και γραμματικές χωρίς συμφραζόμενα στην φάση της συντακτικής ανάλυσης. Για τους σκοπούς της παρουσίασής μας, θα χρειαστούμε τις παρακάτω έννοιες: Αλφάβητο Σ Σύμβολο a Συμβολοσειρά α Μήκος Συμβολοσειράς α Σύνολο συμβολοσειρών μήκους n Σ n Σύνολο όλων των συμβολοσειρών Σ = n=0 Σn Κενή Συμβολοσειρά ɛ Παράθεση Συμβολοσειρών αβ Παράθεση Συμβολοσειράς με τον εαυτό της α 0 = ɛ α n+1 = αα n Γλώσσα L Σ Ένωση Γλωσσών L 1 L2 = {α α L 1 α L 2 } Παράθεση Γλωσσών L 1 L 2 = {αβ α L 1 β L 2 } Παράθεση Γλώσσας με τον εαυτό της L 0 = {ɛ} Κλείσιμο (ή άστρο) του Kleene L n+1 = {LL n } L = n=0 Ln L + = LL Ορισμός 2.1: Μία τυπική γραμματική G = (NT, T, P, S) είναι τετράδα που περιέχει 1. Ένα πεπερασμένο αλφάβητο από μη τερματικά σύμβολα NT 2. Ένα πεπερασμεο αλφάβητο από τερματικά σύμβολα T τέτοιο ώστε NT T = 3. Ένα πεπερασμένο σύνολο από κανόνες παραγωγής α β, δηλαδή διατεταγμένα ζεύγη (α, β) όπου α, β (NT T ) και α 4. Ένα αρχικό σύμβολο S Το 1956 ο Αμερικανός φιλόσοφος Noam Chomsky ταξινόμησε τις τυπικές γραμματικές σε μια ιεραρχία, σύμφωνα με τη μορφή των κανόνων παραγωγή τους: Τύπου 0: Όλες οι γραμματικές, α β Τύπου 1: Γραμματικές με συμφραζόμενα (context-sensitive) α β με α β Τύπου 2: Γραμματικές χωρίς συμφραζόμενα (context-free) A β Τύπου 3: Κανονικές γραμματικές (regular) A ab ή A a 16

17 Καθεμιά από τις κατηγορίες αυτές γραμματικών αναγνωρίζεται από ειδικές μηχανές της θεωρητικής πληροφορικής, που ονομάζονται αυτόματα: Τύπου 0: Μηχανή Turing (TM) Τύπου 1: Γραμμικά περιορισμένη μηχανή Turing (LBA) Τύπου 2: Αυτόματα στοίβας (PDA - Push-down automata), χρήσιμα στην συντακτική ανάλυση Τύπου 3: Πεπερασμένα αυτόματα (finite automata), χρήσιμα στην λεκτική ανάλυση 2.3 Λεκτική Ανάλυση Η λεκτική ανάλυση είναι η πρώτη φάση ενός μεταγλωττιστή, δηλαδή το μέρος αυτό του μεταγλωττιστή το οποίο λαμβάνει πρώτο τον κώδικα που ο χρήστης θέλει να μεταγλωττίσει. Η κύρια λειτουργία του είναι να διαβάσει τους χαρακτήρες εισόδου, να τους χωρίσει σε λεκτήματα και να παρουσιάσει σαν έξοδο μια ακολουθία από σύμβολα της γραμματικής που αναπαριστά την γλώσσα προγραμματισμού στην οποία είναι γραμμένο το πρόγραμμα, τα οποία αντιστοιχούν στα λεκτήματα εισόδου. Το δημιουργηθέν ρεύμα λεκτημάτων εισάγεται τότε στον συντακτικό αναλυτή για συντακτική ανάλυση. Εκτός από την κύρια αυτή λειτουργία, ο λεκτικός αναλυτής είναι συχνά επιφορτισμένος και με κάποιες δευτερεύουσες, πλην όμως σημαντικές λειτουργίες. Για παράδειγμα, τις περισσότερες φορές είναι υπεύθυνος για την αφαίρεση των σχολίων και των κενών που εμφανίζονται (κενοί χαρακτήρες, αλλαγές γραμμής, κ.λπ.) ή ακόμα να συσχετίσει μηνύματα λάθους που τυχόν παράγει ο μεταγλωττιστής με το πρόγραμμα εισόδου. Υπάρχουν αρκετοί λόγοι για τους οποίους το μέρος της ανάλυσης που κάνει ένας μεταγλωττιστής χωρίζεται σε λεκτική και συντακτική. Οι τρεις κυριότεροι, σύμφωνα με το [Aho86] είναι οι εξής: Ο κυριότερος λόγος για τον οποίο γίνεται συνήθως αυτός ο διαχωρισμός είναι η απλούστευση της σχεδίασης. Ο διαχωρισμός αυτός μεταξύ λεκτικής και συντακτικής ανάλυσης συχνά επιτρέπει στους σχεδιαστές να απλοποιήσουν (σε σχεδίαση και υλοποίηση) τουλάχιστον το ένα από τα δύο αυτά κομμάτια. Για παράδειγμα, κάποιος συντακτικός αναλυτής που θα έπρεπε να χειριστεί σχόλια και κενά σαν συντακτικές ομάδες θα ήταν πολύ πιο πολύπλοκος από τους συνήθεις συντακτικούς αναλυτές, όπου αυτά αφαιρούνται από την φάση της λεκτικής ανάλυσης Ένας άλλος λόγος είναι η αύξηση της συνολικής απόδοσης του μεταγλωττιστή. Ο λεκτικός αναλυτής σαν ξεχωριστή οντότητα μας επιτρέπει να εφαρμόσουμε ειδικά σχεδιασμένες τεχνικές, οι οποίες είναι κατάλληλες μόνο για το σκοπό της ανίχνευσης λεκτημάτων, και όχι της συντακτικής ανάλυσης. Επίσης, τεχνικές buffering που έχουν ειδικά επινοηθεί για να διαβάζουν είσοδο, μπορούν να αυξήσουν σημαντικά την ταχύτητα του μεταγλωττιστή Τέλος, αυξάνεται και η φορητότητα του μεταγλωττιστή, αφού τυχόν ιδιομορφίες των συσκευών εισόδου περιορίζονται στον λεκτικό αναλυτή και δεν επηρεάζουν ολόκληρο το σύστημα Όπως είπαμε και στην προηγούμενη παράγραφο, οι λεκτικοί αναλυτές είναι ουσιαστικά πεπερασμένα αυτόματα, τα οποία χρησιμοποιώντας κανονικές εκφράσεις προσπαθούν να ταιριάξουν κάθε σύμβολο εισόδου με κάποιους κανόνες οι οποίοι περιγράφουν την εκάστοτε γλώσσα προγραμματισμού για την οποία επιθυμούμε να φτιάξουμε τον λεκτικό αναλυτή. Για την κατασκευή αυτών των αυτομάτων, στην πράξη χρησιμοποιούμε γεννήτορες λεκτικών αναλυτών, δηλαδή προγράμματα στα οποία δίνουμε την περιγραφή της γραμματικής μας και παίρνουμε στην έξοδο το επιθυμητό αυτόματο (για παράδειγμα flex, Alex), όπως θα δούμε και σε επόμενες παραγράφους. 17

18 2.4 Συντακτική Ανάλυση Γενικά Μετά τον καθαρισμό της εισόδου από τα κενά και τους χαρακτήρες αλλαγής γραμμής, τα tabs κ.λπ. και τον χωρισμό των συμβόλων σε λεκτήματα, ο λεκτικός αναλυτής έχει τελειώσει την δουλειά του και οδηγεί την έξοδό του (δηλαδή το ρεύμα λεκτημάτων που φτιάχνει) στον συντακτικό αναλυτή. Δουλειά του συντακτικού αναλυτή είναι να αναγνωρίσει οποιαδήποτε συντακτικά λάθη υπάρχουν στον κώδικα και ίσως να ανανήψει από κάποια συχνά συναντούμενα λάθη, για να μπορεί να συνεχίσει να αναλύει το υπόλοιπο του προγράμματος. Κατά την ανάλυση αυτή, ο συντακτικός αναλυτής φτιάχνει ένα δέντρο με τα λεκτήματα με τα οποία ο λεκτικός αναλυτής τον προμηθεύει, το οποίο αναπαριστά πλήρως το πρόγραμμα που έχει γράψει ο χρήστης, και ονομάζεται Συντακτικό Δέντρο (Syntax Tree). Υπάρχουν αρκετοί τρόποι αναπαράστασης των συντακτικών δέντρων σε ένα μεταγλωττιστή, οι κυριότεροι από τους οποίους είναι τα Αφηρημένα Συντακτικά Δέντρα (Abstract Syntax Trees - ASTs) και οι Κατευθυνόμενοι Ακυκλικοί Γράφοι (Directed Acyclic Graphs - DAGs). Υπάρχουν δύο μέθοδοι γεμίσματος του συντακτικού δέντρου που χρησιμοποιούνται από τους μοντέρνους μεταγλωττιστές: ο από πάνω προς τα κάτω (top-down), στον οποίο το συντακτικό δέντρο φτιάχνεται ξεκινώντας από την ρίζα και καταλήγοντας στα φύλλα, και ο από κάτω προς τα πάνω (bottom-up), στον οποίο το συντακτικό δέντρο φτιάχνεται ξεκινώντας από τα φύλλα και καταλήγοντας στη ρίζα. Τις μεθόδους αυτές περιγράφουμε στις επόμενες παραγράφους Η top-down Μέθοδος Στην top-down μέθοδο, η συντακτική ανάλυση ξεκινά από τη ρίζα και προχωράει προς τα φύλλα, με τον φυσικό τρόπο που θα σκεφτόταν κάποιος να διακοσμήσει δηλαδή ένα συντακτικό δέντρο. Κάθε φορά ο συντακτικός αναλυτής αναζητά το σύμβολο που θα αντικατασταθεί (συνήθως επιλέγει το αριστερότερο) και τον κανόνα παραγωγής που θα εφαρμοστεί (βάσει των επόμενων k λεκτικών μονάδων - look-ahead συμβόλων - που ακολουθούν στην συμβολοσειρά εισόδου). Οι σημαντικότεροι συντακτικοί αναλυτές της κατηγορίας αυτής είναι οι LL(1) συντακτικοί αναλυτές, οι οποίοι διαβάζουν την συμβολοσειρά εισόδου από αριστερά προς τα δεξιά (L) και αντιστοιχίζουν την διαδικασία κατασκευής του συντακτικού δέντρου στην αριστερότερη (L) παραγωγή, χρησιμοποιώντας μόνο 1 προπορευόμενο σύμβολο. Χρησιμοποιούν μια στοίβα στην οποία τοποθετούν τα σύμβολα της γραμματικής, και στην οποία πριν την έναρξη της διαδικασίας συντακτικής ανάλυσης υπάρχει μόνο το αρχικό σύμβολο της γραμματικής. Κάθε φορά εξετάζεται η κορυφή της στοίβας και λαμβάνονται δράσεις ως εξής: εάν το σύμβολο στην κορυφή της στοίβας είναι τερματικό σύμβολο της γραμματικής και είναι το ίδιο με αυτό που βρίσκεται στην θέση της συμβολοσειράς εισόδου που εξετάζεται, τότε αφαιρούνται και τα δύο. Αν είναι μη τερματικό σύμβολο, τότε αναλόγως με το επόμενο σύμβολο στην συμβολοσειρά εισόδου επιλέγεται κάποιος από τους κανόνες της γραμματικής για εφαρμογή. Επιτυχή συντακτική ανάλυση έχουμε όταν τόσο η στοίβα όσο και η συμβολοσειρά εισόδου είναι άδειες Η bottom-up Μέθοδος Στην bottom-up μέθοδο, η συντακτική ανάλυση ξεκινάει από τα φύλλα και προχωρά προς τη ρίζα του συντακτικού δέντρου. Ο bottom-up συντακτικός αναλυτής αναζητά τον αριστερότερο κόμβο του δέντρου που δεν έχει κατασκευαστεί, ενώ όλα τα παιδιά του έχουν κατασκευαστεί. Η διαδικασία αυτή συνεχίζεται μέχρι να κατασκευαστεί και ο τελευταίος κόμβος του δέντρου, δηλαδή η ρίζα. Εδώ είναι χρήσιμο να αναφέρουμε την λειτουργία της ελάττωσης (reduce), με τη βοήθεια της οποίας γίνεται η επιλογή των κόμβων που θα αποτελέσουν τα παιδιά ενός νέου κόμβου. Οι πιο διαδεδομένοι bottom-up συντακτικοί αναλυτές είναι οι Συντακτικοί Αναλυτές ολίσθησηςελάττωσης (shift-reduce): Η κύρια δομή δεδομένων που χρησιμοποιούν είναι μια στοίβα, η οποία 18

19 πριν ξεκινήσει η συντακτική ανάλυση είναι κενή, και στην οποία τοποθετούνται όλα τα σύμβολα της γραμματικής. Η λειτουργία της ολίσθησης (shift) είναι ουσιαστικά η μεταφορά ενός συμβόλου από την είσοδο στην κορυφή της στοίβας, ενώ με την ελάττωση (reduce) αφαιρείται από την κορυφή της στοίβας το δεξιό μέλος ενός κανόνα παραγωγής και στη θέση του προστίθεται το αριστερό μέλος του ίδιου κανόνα. Η συντακτική ανάλυση έχει επιτύχει εάν η στοίβα περιέχει μόνο το αρχικό σύμβολο της γραμματικής, και δεν υπάρχουν άλλα σύμβολα στην είσοδο. Οι bottom-up συντακτικοί αναλυτές μπορούν να κατηγοριοποιηθούν με βάση ποιού τύπου γραμματική αναγνωρίζουν. Οι κύριες κατηγορίες είναι: Oι LR(k), οι οποίοι διαβάζουν την συμβολοσειρά εισόδου από αριστερά (L) προς τα δεξιά, κατασκευάζουν το συντακτικό δέντρο χρησιμοποιώντας την δεξιότερη (R) παραγωγή, και χρειάζονται k προπορευόμενα (look-ahead) σύμβολα για την επιλογή του κανόνα προς ελάττωση Οι SLR (Simple LR), οι οποίοι είναι παραλλαγές των προηγούμενων έτσι ώστε να αναγνωρίζουν μεγαλύτερο πλήθος γλωσσών από τους LR(0) συντακτικού αναλυτές και Οι LALR(1), οι οποίοι είναι Lookahead LR(1) συντακτικοί αναλυτές. Είναι οι πιο ευρέως χρησιμοποιούμενοι, αφού βρίσκονται ανάμεσα στις πιο πάνω κατηγορίες όσον αφορά την εκφραστικότητα (δηλαδή το πλήθος των γραμματικών που αναγνωρίζουν) και των απαιτήσεων μνήμης (δηλαδή το μέγεθος των πινάκων συντακτικής ανάλυσης) που απαιτούν Η Γλώσσα Προγραμματισμού Minibasic Για τους σκοπούς της εργασίας αυτής, χρησιμοποιούμε την περιγραφή ενός υποσυνόλου της Basic 2. Την πειραματική αυτή γλώσσα προγραμματισμού ονομάζουμε Minibasic, και ένας διερμηνέας γι αυτήν φτιάχτηκε στα πλαίσια του μαθήματος Μεταγλωττιστές (μπορεί να βρεθεί στην ιστοσελίδα του μαθήματος 3 ). Μια περιγραφή της MiniBasic σε EBNF δίνεται παρακάτω: program ::= stmt list stmt list ::=. stmt stmt list stmt expr ::= print expr let identifier = expr for expr do stmt begin stmt list end if expr then stmt ::= const identifier ( expr ) expr + expr expr expr expr expr 1 Σημειώνεται ότι με το μεταεργαλείο Bison που θα αναφέρουμε στην επόμενη παράγραφο σχεδιάζουμε LALR(1) συντακτικούς αναλυτές

20 2.6 Το πρόγραμμα επεξεργασίας κειμένου Meddle Στην εργασία αυτή, θα ασχοληθούμε με την μελέτη του επεξεργαστή κειμένου Meddle 4, στον οποίο υλοποιούνται κάποιοι αλγόριθμοι που αφορούν την αυξητική λεκτική και συντακτική ανάλυση κώδικα. Το Meddle είναι διανεμημένο υπό την άδεια ανοικτού λογισμικού GPL 5, και στην πρώτη του μορφή υποστήριζε λειτουργίες εξασφάλισης πληροφοριών για την σύνταξη των εντολών της γλώσσας προγραμματισμού C 6 και του προεπεξεργαστή της, όπως αναλυτικά περιγράφεται στο [Lahaa]. Στο Meddle, η λεκτική και συντακτική περιγραφή της γλώσσας προγραμματισμού για την οποία το θέλουμε να εκτελεί αυξητικού χαρακτήρα λεκτική και συντακτική ανάλυση, γράφεται σε δύο αρχεία, ένα για να χρησιμοποιηθεί με το εργαλείο flex 7, και ένα για να χρησιμοποιηθεί με το εργαλείο bison 8. Τα εργαλεία αυτά είναι γεννήτορες λεκτικών και συντακτικών αναλυτών, στους οποίους σαν είσοδο βάζουμε την περιγραφή της γλώσσας για την οποία θέλουμε να κατασκευάσουμε τον αντίστοιχο αναλυτή, και στην έξοδό τους βγάζουν ένα αρχείο C, το οποίο μεταγλωττιζόμενο μας δίνει το αντίστοιχο πρόγραμμα. Η περιγραφή της MiniBasic για τα εργαλεία αυτά δίνεται παρακάτω: Περιγραφή της MiniBasic για το εργαλείο flex 1 / c. l f o r m i n i b a s i c / 2 3 %{ 4 # d e f i n e YYFLEXLEXER DEFINED 5 6 # i n c l u d e lexer.h 7 # i n c l u d e debug.h 8 u s i n g namespace s t d ; 9 10 # d e f i n e T eof # d e f i n e RETURN TOKEN( name, s t y l e ) \ 13 DPRINT (D SCANNER, ( %s (%s)\n, y y t e x t, # name ) ) ; \ 14 m nstyle = StyleManager : : s t y l e ; \ 15 m nstreampos += y yleng ; \ 16 return name 17 # d e f i n e SET STATE ( s t a t e ) BEGIN( s t a t e ) 18 # d e f i n e INIT MTOKEN ( ) 19 # d e f i n e CONT MTOKEN( ) %} %o p t i o n noyywrap 24 %o p t i o n y y c l a s s = LexerBase 25 %x PP 26 %s MAC D [0 9] 29 L [ a z ] 30 W [ \ t \ r ] %% 4 elahav/meddle (programming language)

21 33 print { RETURN TOKEN( T p r i n t, Keyword ) ; } 34 let { RETURN TOKEN( T l e t, Keyword ) ; } 35 for { RETURN TOKEN( T for, Keyword ) ; } 36 do { RETURN TOKEN( T do, Keyword ) ; } 37 begin { RETURN TOKEN( T begin, Keyword ) ; } 38 end { RETURN TOKEN( T end, Keyword ) ; } 39 if { RETURN TOKEN( T i f, Keyword ) ; } 40 then { RETURN TOKEN( T then, Keyword ) ; } 41 lefin { RETURN TOKEN( T f i n, Keyword ) ; } 42. { RETURN TOKEN( T dot, Keyword ) ; } {D}+ { RETURN TOKEN( T const, Number ) ; } 45 {L} { RETURN TOKEN( IDENTIFIER, I d e n t i f i e r ) ; } [ = \ ( \ ) \+\ \ \<\>] { RETURN TOKEN( y y t e x t [ 0 ], Normal ) ; } {W}+ { RETURN TOKEN(WSPACE, None ) ; } 50 \ n { RETURN TOKEN( NEWLINE, None ) ; } 51 \.*\n { RETURN_TOKEN(NEWLINE, None); } <<EOF>> { RETURN_TOKEN(T_eof, None); } 54. { exit(1); } %% void yyerror(const char *) 59 { 60 } 1 / c. y f o r m i n i b a s i c / 2 3 %{ 4 # i n c l u d e environment.h 5 # i n c l u d e debug.h 6 %} 7 8 %union { 9 TokenTypeSelf ; 10 TokenTypeText ; 11 TokenTypeEnv ; 12 } %t o k e n NONE %t o k e n <TokenTypeText> IDENTIFIER 18 %t o k e n <TokenTypeText> T c o n s t %t o k e n T l e t let 21 %t o k e n T begin begin 22 %t o k e n T end end 23 %t o k e n T p r i n t print 24 %t o k e n T f o r for 25 %t o k e n T do do 26 %t o k e n T i f if 27 %t o k e n T t h e n then Περιγραφή της MiniBasic για το εργαλείο bison 21

22 28 %t o k e n T f i n lefin 29 %t o k e n T dot. 30 %t o k e n PREPROC MACRO NEWLINE WSPACE COMMENT 31 %t o k e n PP HASH PP DEFINE PP UNDEF PP INCLUDE PP IF PP IFDEF PP ELSE PP ELIF PP ENDIF 32 %t o k e n MAC CONCAT MAC STRINGIFY %l e f t %l e f t * %s t a r t program %% program : s t m t l i s t 42 ; s t m t l i s t : T dot 45 s t m t s t m t l i s t 46 ; s t m t : print expr 49 let IDENTIFIER = expr { New( $2 ) ; S e t S t y l e ( Local ) ; SetTopLevel ( ) ; } 50 for expr do s t m t 51 begin s t m t l i s t end 52 if expr then s t m t 53 ; expr : T c o n s t 56 IDENTIFIER 57 ( expr ) 58 expr + expr 59 expr - expr 60 expr * expr 61 ; %% 2.7 Το πρόγραμμα επεξεργασίας κειμένου Yi Οι συνεχείς απαιτήσεις των προγραμματιστών για μεγαλύτερες δυνατότητες ελέγχου της σύνταξης των προγραμμάτων τους, οδήγησε τους δημιουργούς του προγράμματος επεξεργασίας κειμένου Yi 9 να του προσθέσουν πρόσφατα 10 και λειτουργίες αυξητικής συντακτικής ανάλυσης. Το αξιοσημείωτο με το πρόγραμμα αυτό, είναι ότι είναι υλοποιημένο εξ ολοκλήρου σε Haskell 11, έτσι η ιδέα για οκνηρή συναρτησιακή αυξητική συντακτική ανάλυση ήρθε εντελώς φυσικά στους συγγραφείς του [Bern09], οι οποίοι εκμεταλλευόμενοι πλήρως τις δυνατότητες της Haskell κοίταξαν το πρόβλημα της αυξητικής λεκτικής και συντακτικής ανάλυσης υπό εντελώς διαφορετικό πρίσμα από τους προηγούμενους μελετητές ([Lahaa], [Wagn97], [WAGN98], [Wagn96]). Στον επεξεργαστή κειμένου Yi, βάζουμε έχουμε στον φακέλο /Yi/Lexer τις λεκτικές περιγραφές διαφόρων γλωσσών προγραμματισμού, και στον /Yi/Syntax τις συντακτικές περιγραφές τους, έτσι ώστε yi blog incremental parsing in yi/

23 να έχουμε αυξητικού χαρακτήρα λεκτική και συντακτική ανάλυση όταν γράφουμε κώδικα για τις γλώσσες αυτές. Στον φάκελο /Yi/Lexer βάζουμε το αρχείο που περιγράφει την γλώσσα μας για το εργαλείο γένεσης λεκτικού αναλυτή Alex 12 (είναι το αντίστοιχο του flex για την γλώσσα προγραμματισμού Haskell), ενώ στον φάκελο /Yi/Syntax το αρχείο που περιγράφει έναν συντακτικό αναλυτή για τη γλώσσα μας, γραμμένο σε Haskell. Η περιγραφή της MiniBasic για τον Yi δίνεται παρακάτω: Περιγραφή της MiniBasic για το εργαλείο Alex 1 Simple l e x e r f o r M i n i B a s i c N. T.U. A. 3 4 { 5 6 import Yi. Lexer. Alex 7 import Yi. S t y l e 8 9 } $D = [0 9] 12 $L = [ a z ] 13 $W = [ \ t \ r ] 14 $normal = [ = \ ( \ ) \+\ \ \<\>] 15 = p r i n t l e t f o r do b e g i n end i f then = + - / * h a s k e l l : <0> { $W+ ; 24 $D+ { c s $ Number } { c s $ ( Op. OpToOp ) } { cs $ ( Res. restores ) } 27 $L { cs $ I d e n t i f i e r } 28 $W+ ; } { type TT = Tok Token data Reserved = P r i n t Let For Do Begin End I f Then 37 d e r i v i n g ( Show, Eq) data O p e r a t o r = Add S u b t r a c t M u l t i p l y Divide Dot 40 d e r i v i n g ( Show, Eq) data Token = Res! Reserved 43 Op! O p e r a t o r 44 Num! Number 45 Id! I d e n t i f i e r 46 d e r i v i n g ( Show, Eq)

24 47 48 s t a t e T o I n i t x = i n i t S t a t e : : I n t 51 i n i t S t a t e = t o k e n T o S t y l e ( Res ) = k e y w o r d S t y l e 54 t o k e n T o S t y l e ( Op ) = d e f a u l t S t y l e 55 t o k e n T o S t y l e (Num ) = numberstyle 56 t o k e n T o S t y l e ( Id ) = d e f a u l t S t y l e optoop : : S t r i n g > O p e r a t o r 59 optoop + = Add 60 optoop - = S u b t r a c t 61 optoop * = M u l t i p l y 62 optoop / = Divide 63 optoop. = Dot restores : : S t r i n g > Reserved 66 restores print = P r i n t 67 restores for = For 68 restores do = Do 69 restores begin = Begin 70 restores end = End 71 restores if = I f 72 restores then = Then } 24

25 Κεφάλαιο 3 Η πρώτη ιδέα Πριν ξεκινήσουμε την περιγραφή των πιο σύγχρονων μεθόδων αυξητικής λεκτικής και συντακτικής ανάλυσης, θεωρούμε χρήσιμο να αναφέρουμε λίγα λόγια για τις προηγούμενες δουλειές στον τομέα αυτό, αφού η καθεμιά με τον δικό της τρόπο επηρέασε την ανάπτυξη των μεταγενέστερων. 3.1 Ο αλγόριθμος Jalili-Galier Οι πρώτοι που παρουσίασαν έναν ολοκληρωμένο (και ορθό) αλγόριθμο για αυξητική συντακτική ανάλυση LR(1) γραμματικών είναι οι Jalili και Galier ([Jali82]). Ο αλγόριθμός τους βασίζεται σε κριτήρια ταιριάσματος καταστάσεων (state-matching), τα οποία γενικά αναθέτουν σε κάθε κόμβο στο συντακτικό δέντρο την κατάσταση του συντακτικού αναλυτή, στην οποία βρισκόταν πριν αυτός ολισθήσει (shift). Αυτό είναι κρίσιμης σημασίας για τον αυξητικό χαρακτήρα της ανάλυσης στην οποία υπόκειται κάθε τμήμα κώδικα που εισάγεται στον αντίστοιχο μεταγλωττιστή, αφού σε κάθε βήμα ολίσθησης-ελάττωσης μπορούμε να έχουμε μια πλήρη εικόνα για το τί ακριβώς συμβαίνει στην διαδικασία ανάλυσης. Οι Jalili και Galier πρότειναν επίσης και την επαναχρησιμοποίηση των επιμέρους συντακτικών δέντρων, δείχνοντας στο [Jali82] ότι υποδέντρα του συντακτικού δέντρου μπορούν να επαναχρησιμοποιηθούν καθώς αναλύεται η νέα ροή λεκτημάτων. Η ιδέα αυτή, βασίζεται στην ακόλουθη παρατήρηση: Πρόταση 3.1: Έστω G = (V T, V N, P, S) μια γραμματική LR(1), x, y (V T V N ) + είναι μη κενές συμβολοσειρές στο αλφάβητο της γραμματικής και a V T ένα τερματικό σύμβολο. Υποθέτουμε ότι το κείμενο προς ανάλυση είναι το xya, και s είναι η πρώτη κατάσταση στην στοίβα μετά την συντακτική ανάλυση του x. Αν το y ελαττωθεί στο μη τερματικό σύμβολο A βάση του lookahead συμβόλου a, τότε θα ελαττωθεί επίσης στο A όταν αναλύεται το x ya για κάθε συμβολοσειρά x για την οποία μετά την ανάλυση, η πρώτη κατάσταση στην στοίβα είναι επίσης η s. Δηλαδή, ένας ντετερμινιστικός συντακτικός αναλυτής LR(1) γραμματικών θα ελαττώσει μια συμβολοσειρά σε ένα μόνο σύμβολο, βασισμένος μόνο στην παρούσα κατάσταση της στοίβας και σε ένα lookahead σύμβολο, ανεξάρτητα από τα σύμβολα και τις άλλες αποφάσεις (shift/reduce) που οδήγησαν τον αναλυτή στην κατάσταση αυτή. Χρησιμοποιώντας την ορολογία του [Jali82], ένα υποδέντρο με ρίζα το σύμβολο μπορεί να επαναχρησιμοποιηθεί, αν πραγματοποιώντας όλες τις αποφάσεις ολίσθησης/ελάττωσης (χρησιμοποιώντας το First(A)), ισχύουν τα ακόλουθα: 1. Ο συντακτικός αναλυτής βρίσκεται στην ίδια κατάσταση που ήταν όταν το ολίσθησε κατά τη διάρκεια κατασκευής του αρχικού συντακτικού δέντρου 2. Το lookahead σύμβολο είναι το ίδιο με αυτό που χρησιμοποιήθηκε για να αποφασιστεί η ολίσθηση του. Είναι προφανές ότι με την επαναχρησιμοποίηση υποδέντρων του κατασκευαζόμενου συντακτικού δέντρου, οι Jalili και Galier καταφέρνουν να ελαχιστοποιήσουν τις αποφάσεις ολίσθησης/ελάττωσης των συντακτικών αναλυτών, αφού η κατάσταση goto(s,a) τοποθετείται στην κορυφή της στοίβας χωρίς καμία άλλη εξέταση των περιεχομένων της τερματικής συμβολοσειράς που μένει από το A. 25

26 Στην περίπτωση που κάποιο υποδέντρο δεν μπορεί να επαναχρησιμοποιηθεί ολόκληρο, δηλαδή δεν πληροί τις παραπάνω προϋποθέσεις στην ολότητά του, τότε μπορεί να διασπαστεί με κατάλληλο τρόπο σε μικρότερα υποδέντρα τα οποία να πληρούν τις προϋποθέσεις για επαναχρησιμοποίηση. 3.2 Η μέθοδος Beetem-Beetem Στο [Beet91], οι Beetem και Beetem εισαγάγουν μια δομή που ονομάζεται kmn-list, για να πετύχουν την ακριβή εύρεση των σημείων στα οποία τμήμα κώδικα έχει αλλάξει (προστεθεί, αφαιρεθεί ή απλά αντικατασταθεί), έτσι ώστε να γίνεται εύκολα γνωστό από ποιό σημείο του προγράμματος και μετά χρειάζεται να ξεκινήσει ξανά η λεκτική και συντακτική ανάλυσή του. Δυστυχώς, ο αλγόριθμος τον οποίο επινόησαν στηρίζεται σε συντακτικό αναλυτή αναδρομικής καθόδου (recursive descent parser), κατάλληλο για ανάλυση προγραμμάτων γραμμένα σε γλώσσες προγραμματισμού που έχουν περιγραφεί από LL(1) γραμματικές. Οι περισσότερες σύγχρονες γλώσσες προγραμματισμού περιγράφονται από LALR(1) γραμματικές, και οι ευρέως χρησιοποιούμενοι γεννήτορες συντακτικών αναλυτών (όπως για παράδειγμα το bison 1 ) απαιτούν την περιγραφή των γλωσσών χρησιμοποιώντας ακριβώς αυτή την κλάση γραμματικών. 3.3 Το εγχείρημα Harmonia Στο πανεπιστήμιο του Berkeley στην Καλιφόρνια των Ηνωμένων Πολιτειών από το 1988 μέχρι και το 2006 σε εξέλιξη ήταν το πρόγραμμα Harmonia 2, αποτελούμενο από αρκετές δημοσιεύσεις και διατριβές, πολλές από τις οποίες αφορούν επεξεργαστές κειμένου γενικότερα ([Bege04], [McCa02], [Bege05a], [Bosh00], [Bosh07], [Bosh01], [Bosh03], [Mari], [Toom04]), επεξεργαστές κειμένου που χρησιμοποιούν φωνητικές εντολές ([Bege00], [Bege05b], [Bege06]) και μεθόδους αυξητικής λεκτικής και συντακτικής ανάλυσης ([Ball88], [Wagn96], [Wagn97], [WAGN98]). Στο [Ball88], οι Ballance, Butcher και Graham προτείνουν την χρήση αφαιρετικών γραμματικών (grammar abstractions) για την κατασκευή επεξεργαστών κειμένων. Γενικά, μια γραμματική αναφέρεται ως αφαίρεση κάποιας άλλης, αν κάθε δομή που περιγράφεται στην αφαίρεση, περιγράφεται επίσης (με τον ίδιο τρόπο) και στην αρχική γραμματική. Είναι, δηλαδή, σαν στιγμιότυπα γενικότερων γραμματικών, που κληρονομούν στοιχεία από την κατασκευή τους. Παρόλο που οι αφαιρετικές γραμματικές δεν χρησιμοποιούνται για μεταγλώττιση, είναι χρήσιμες για την κατασκευή επεξεργαστών κειμένων, διότι δεν χρειάζεται να δώσουν όλες τις σημασιολογικές πληροφορίες του κειμένου που διαμορφώνεται από τον προγραμματιστή, όπως για παράδειγμα μπορεί να αγνοήσουν την προτεραιότητα των τελεστών στις αλγεβρικές πράξεις. Με τον τρόπο αυτό, οι συντακτικοί αναλυτές γίνονται γρηγορότεροι και καταλληλότεροι για δυναμικά περιβάλλοντα, όπως οι επεξεργαστές κειμένων. Στο Harmonia περιγράφονται αλγόριθμοι και μέθοδοι για επιτυχή και αποδοτική συντακτική ανάλυση συνεπών (unambiguous) γλωσσών προγραμματισμού. Αυτό όμως δεν είναι και τόσο συνεπές με ό,τι επικρατεί στην καθημερινότητα ενός προγραμματιστή, αφού αρκετές από τις πιο δημοφιλείς γλώσσες προγραμματισμού περιέχουν πολλές σημασιολογικές αμφισημίες, όπως για παράδειγμα η C. Αυτό συμβαίνει όταν η συντακτική ανάλυση εξαρτάται από σημασιολογικές πληροφορίες για το πρόγραμμα, όπως την χρήση των ορισμών τύπων στην C, όπου ο λεκτικός αναλυτής δε μπορεί να αναγνωρίσει ένα λέκτημα ως τύπο, αν αυτό δεν έχει δηλωθεί κατάλληλα. Για τη συγκεκριμένη γλώσσα προγραμματισμού, αυτό εξαρτάται από την σωστή επεξεργασία των αρχείων κεφαλίδων (header files), πρόβλημα το οποίο λύνεται στο [Wagn97], όπου οι γενικευμένες (generalized) γραμματικές χρησιμοποιούνται για την κατασκευή συντακτικών αναλυτών με αυξητική συμπεριφορά διαδίδοντας σημασιολογικές πληροφορίες (όπως τους ορισμούς τύπων) διαμέσου του συντακτικού δέντρου. Επίσης,

27 στο [WAGN98] περιγράφεται ένας βέλτιστος αυξητικός συντακτικός αναλυτής, βασισμένος στον αλγόριθμο Jalili-Galier ( 3.1) που εγγυείται την επαναχρησιμοποίηση του μέγιστου αριθμού υποδέντρων του συντακτικού δέντρου. 27

28

29 Κεφάλαιο 4 Καταγράφοντας τις αλλαγές στον Text Buffer 4.1 Γενικά Ένα τετριμμένο σενάριο για έναν επεξεργαστή κειμένου θα ήταν να ξεκινήσει με το πλήρες κείμενο στη διάθεσή του (για παράδειγμα όταν ο χρήστης φορτώσει το αρχείο στη μνήμη που διαθέτει ο επεξεργαστής κειμένου). Έτσι, πολύ απλά, θα μπορύσαμε να εφαρμόσουμε λεκτική και συντακτική ανάλυση στον κώδικα που περιέχεται στο αρχείο χρησιμοποιώντας συμβατικές (batch) μεθόδους, δημιουργώντας το αρχικό ρεύμα λεκτημάτων και το μοναδικό συντακτικό δέντρο που αντιστοιχεί στο εν λόγω πρόγραμμα. Το ενδιαφέρον στο σενάριο αυτό, είναι όταν ο χρήστης αρχίζει να αλλάζει τον κώδικα, επιφέροντας έτσι ραγδαίες και τυχαίες αλλαγές στο κείμενο. Για να δει τα αποτελέσματα των αλλαγών αυτών στο ρεύμα των λεκτημάτων και κατά συνέπεια στο συντακτικό δέντρο, ο χρήστης θα πρέπει να επαναλάβει τις διαδικασίες της λεκτικής και της συντακτικής ανάλυσης στον κώδικά του. Για να κρατήσουμε την απόδοση του επεξεργαστή κειμένου μας σε πολύ υψηλά επίπεδα, θα πρέπει να αντικαταστήσουμε τις συμβατικές μεθόδους λεκτικής και συντακτικής ανάλυσης με άλλες, πιο αποδοτικές, με αυξητική συμπεριφορά, ώστε κάθε αλλαγή να καταγράφεται ανά τακτά χρονικά διαστήματα και καθώς ο χρήστης τροποποιεί τον κώδικά του. Η φυσική προσέγγιση στο πρόβλημα επιβάλλει η αυξητική λεκτική και συντακτική ανάλυση να ξεκινήσουν αμέσως μόλις ο προγραμματιστής αρχίσει να μεταβάλλει τα περιεχόμενα του αρχείου. Ο επεξεργαστής κειμένου, δηλαδή, θα ξεκινήσει να καταγράφει τις αλλαγές στον κώδικα μόλις έχει διαθέσιμους όλους τους πόρους του για την ανάλυση του κειμένου (όταν θα σταματήσει να επεξεργάζεται εντολές του χρήστη). Ακόμα, επειδή θέλουμε τα αποτελέσματα του λεκτικού και συντακτικού αναλυτή να φαίνονται στην οθόνη μόλις αυτά είναι έτοιμα, οι αλλαγές στον buffer μπορεί να μην είναι ορατές πριν οι φάσεις της λεκτικής και συντακτικής ανάλυσης ολοκληρωθούν, οδηγώντας μας μακριά από μια πολυνηματική (multi-threaded) προσέγγιση. 4.2 Η δομή kmn-list Σε έναν επεξεργαστή κειμένου, οι αλλαγές που γίνονται από το χρήστη καταλήγουν να είναι δύο ειδών: Εισαγωγή νέου κειμένου σε οποιοδήποτε σημείο του αρχείου Διαγραφή τμήματος κειμένου από οποιοδήποτε σημείο του κειμένου Ακόμα και η θεώρηση της αντικατάστασης κειμένου που αναφέρεται στα [Beet91] και [Jali82] ως μια ενιαία διαδικασία και οδηγεί στην κατασκευή περίπλοκων αλγορίθμων που περιγράφονται στα παραπάνω άρθρα, είναι εύκολο να διαχωριστεί ως συνδυασμός μιας διαγραφής τμήματος κειμένου με μια εισαγωγή κειμένου. Με τον τρόπο αυτό, όπως θα δούμε παρακάτω, μειώνεται αρκετά η πολυπλοκότητα των αλγορίθμων που περιγράφονται για την διαδικασία αλλαγής/λεκτικής ανάλυσης/συντακτικής ανάλυσης. 29

30 Οι Beetem και Beetem στο [Beet91] περιέγραψαν πρώτοι έναν απλό και αποδοτικό τρόπο καταγραφής των αλλαγών στον text buffer, χρησιμοποιώντας μια νέα δομή δεδομένων, που ονομάζεται kmn-list. Η δομή αυτή είναι ουσιαστικά μια συνδεδεμένη λίστα από κόμβους, όπου ο κάθε κόμβος έχει τα εξής 3 πεδία: k: Ο αριθμός των διαδοχικών αναλλοίωτων χαρακτήρων m: Ο αριθμός των χαρακτήρων που διαγράφηκαν n: Ο αριθμός των χαρακτήρων που εισήχθηκαν μετά τους αναλλοίωτους Παράδειγμα 1. Η αλλαγή στο κείμενο της λέξης καλός σε καλιτέχνης μπορεί να περιγραφεί από τον κόμβο (3,2,7). Δηλαδή 3 χαρακτήρες έμειναν αναλλοίωτοι ( κ, α, λ ), 2 διαγράφηκαν ( ό, ς ) και 7 νέοι προστέθηκαν ( ι, τ, ε, χ, ν, η, ς ). Χρησιμοποιώντας την ορολογία του [Lahaa], θα ονομάζουμε για το υπόλοιπο της εργασίας αυτής σταθερή περιοχή του κόμβου το τμήμα εκείνο στο οποίο αναφέρεται το πεδίο k της kmn-list, ως διαγραμμένη περιοχή το τμήμα στο οποίο αναφέρεται το πεδίο m της kmn-list, και ως εισαγώμενη περιοχή το τμήμα στο οποίο αναφέρεται το n πεδίο της kmn-list. Για να εξηγήσουμε πώς ακριβώς η δομή kmn-list βοηθά στην διατήρηση των αλλαγών στο text buffer, ας θεωρήσουμε ένα text buffer το οποίο περιέχει k χαρακτήρες. Μπορεί δηλαδή να αναπαρασταθεί από μιαν kmn-list η οποία αποτελείται από έναν μόνο κόμβο, τον (k, 0, 0). Καθώς ο χρήστης αλλάζει το κείμενο, η λίστα αυτή μεγαλώνει, και παίρνει τη μορφή (k 1, m 1, n 1 ),..., (k l, m l, n l ). Με τον τρόπο αυτό αναπαράστασης παρατηρούμε ότι εύκολα μπορούμε να αναπαραστήσουμε τον παλιό buffer (πριν τις αλλαγές) ως k 1, m 1, k 2, m 2,..., k l, m l, και τον νέο buffer (μετά τις αλλαγές) ως k 1, n 1, k 2, n 2,..., k l, n l. Το παρακάτω παράδειγμα αποσαφηνίζει πώς ακριβώς λειτουργεί η δομή kmn-list: Παράδειγμα 2. Έστω ένας text buffer που περιέχει την εξής πρόταση: Χθες είδε έναν ακόμα μεγάλο μαύρο σκύλο. Αλλάζουμε την πρόταση ως εξής: Χθες είδαμε έναν καφέ ακόμα μεγάλο σκύλο. Τα υπογραμμισμένα τμήματα στην αρχική πρόταση διαγράφηκαν και τα υπογραμμισμένα τμήματα στην νέα πρόταση προστέθηκαν από το χρήστη. Οι αλλαγές αυτές αναπαρίστανται από την εξής kmn-list: (9,1,3);(4,0,5);(19,6,0);(6,0,0) 4.3 Διαχείριση αλλαγών στο text buffer Στην βιβλιογραφία προτείνονται δύο συγγενείς τρόποι διαχείρισης των αλλαγών στο text buffer. Στο [Jali82] χρησιμοποιείται μόνο μια γενική συνάρτηση η οποία ονομάζεται KMN-INSERT, δέχεται σαν όρισμα την θέση pos μιας αλλαγής, τον αριθμό των χαρακτήρων που αφαιρούνται από την pos και τον αριθμό των χαρακτήρων που εισάγονται στην pos και μεταβάλλει την κατάσταση της kmn-list έτσι ώστε να περιέχει τις νέες αλλαγές. Στο [Lahaa], όμως, προτείνεται η χρησιμοποίηση δύο συναρτήσεων για την διαχείριση των αλλαγών στο text buffer, μιας για την αφαίρεση και μιας για την εισαγωγή χαρακτήρων, λόγω του ότι στην πρώτη περίπτωση οδηγούμαστε σε αχρείαστα μεγάλη πολυπλοκότητα στην σχεδίαση και υλοποίηση του αλγορίθμου. 30

31 4.3.1 Εισαγωγές χαρακτήρων στο text buffer Το πρώτο είδος αλλαγών που ένας χρήστης μπορεί να επιφέρει στο text buffer είναι οι εισαγωγές χαρακτήρων. Η λειτουργία αυτή επιτυγχάνεται με τη συνάρτηση KMN-INSERT, η οποία περιγράφεται λεπτομερώς στον Αλγόριθμο 1. Στην πρώτη γραμμή προσπερνούνται όλοι οι kmn-κόμβοι που δεν επηρεάζονται από την αλλαγή, μέχρι να φτάσουμε στον πρώτο κόμβο στον οποίο παρατηρούνται διαφοροποιήσεις. Προφανώς για να καταγράψουμε τις αλλαγές αυτές θα πρέπει να λάβουμε υπόψην τόσο την σταθερή, όσο και την εισαχθείσα περιοχή, αφού αυτά είναι ουσιαστικά τα πεδία που περιγράφουν την κατάσταση του τρέχοντος buffer. Φτάνοντας στον πρώτο κόμβο που επηρεάζεται από τις αλλαγές, ο αλγόριθμος μας αφήνει δύο επιλογές, στηριζόμενες στο είδος της περιοχής στην οποία γίνεται η εισαγωγή: Επιλογή 1. Η εισαγωγή γίνεται μέσα στην σταθερή περιοχή του κόμβου. Τότε ο κόμβος χωρίζεται σε δύο μικρότερους: ο πρώτος περιέχει το μέρος της σταθερής περιοχής του μεγάλου μέχρι το σημείο εισαγωγής και το νεοεισαχθέν κείμενο, ενώ ο δεύτερος περιέχει το υπόλοιπο μέρος της σταθερής περιοχής του αρχικού κόμβου (μετά το σημείο εισαγωγής), καθώς και οποιεσδήποτε προηγούμενες αλλαγές σημειώθηκαν στον αρχικό κόμβο. Η διαδικασία αυτή περιγράφεται στις γραμμές 3-8 του Αλγορίθμου 1. Επιλογή 2. Η εισαγωγή γίνεται είτε μέσα στην εισαγώμενη περιοχή του κόμβου, είτε αμέσως μετά από αυτήν. Η περίπτωση αυτή είναι η ευκολότερη από τις δύο, αφού η μόνη ενέργεια που πρέπει να γίνει είναι να αυξηθεί η εισαγώμενη περιοχή του κόμβου τόσο όσο να περιέχει την αλλαγή. Η διαδικασία αυτή περιγράφεται στις γραμμές 9-10 του Αλγορίθμου 1. Η κύρια διαφορά με τον περίπλοκο αλγόριθμο που προτείνουν οι Jalili και Gallier, είναι ότι με την παραπάνω διάκριση δεν χρειάζονται καθόλου συγχωνεύσεις κόμβων για να διατηρηθεί η συμπάγεια της λίστας. Μπορούμε πλέον να δούμε ολοκληρωμένο τον Αλγόριθμο 1: Αλγόριθμος 1: KMN-INSERT 1 Skip a l l nodes f o r which pos [ node ] + node. k + node. n <= i n s p o s 2 node < f i r s t node f o r which t h e above c o n d i t i o n does not hold 3 i f pos [ node ] + node. k > i n s p o s then 4 Add a node new b e f o r e node 5 new. k < pos pos [ node ] ; new.m < 0 ; new. n < l e n 6 node. k < node. k new. k 7 e l s e 8 node. n < node. n + l e n 9 end i f Διαγραφές χαρακτήρων από το text buffer Η περίπτωση της διαγραφής είναι κάπως δυσκολότερη από αυτήν της εισαγωγής χαρακτήρων. Η διαδικασία αυτή της διαγραφής χαρακτήρων, επιτυγχάνεται από την συνάρτηση KMN-DELETE, η οποία περιγράφεται στον Αλγόριθμο 2. Όπως ακριβώς με την εισαγωγή κειμένου, ξεκινάμε βρίσκοντας τον πρώτο κόμβο Ν ο οποίος επηρεάζεται από την αλλαγή (γραμμές 1-2 του Αλγορίθμου 2). Τότε βρισκόμαστε αντιμέτωποι με δύο επιλογές: Επιλογή 1. Το διαγραφέν διάστημα χαρακτήρων βρίσκεται στην ολότητά του μέσα στην σταθερή περιοχή του Ν. Τότε, χωρίζουμε τον Ν με τρόπο παρόμοιο μ αυτόν που χρησιμοποιήσαμε στον Αλγόριθμο 1, λαμβάνοντας μόνο υπόψην το πεδίο m που αφορά τους διαγραφέντες χαρακτήρες του text buffer. Η διαδικασία αυτή περιγράφεται στις γραμμές 3-7 του αλγορίθμου. Επιλογή 2. Το διαγραφέν διάστημα χαρακτήρων εκτείνεται μέχρι το τέλος της σταθερής περιοχής του Ν, και ίσως και μετά από αυτό. Στην περίπτωση αυτή απαιτείται η ολοκλήρωση των παρακάτω βημά- 31

32 των για την ορθή απεικόνιση των χαρακτήρων που διαγράφηκαν (σημειώνεται ότι με d συμβολίζουμε τον αριθμό των χαρακτήρων που χρειάζεται να αφαιρεθούν): 1. Πρώτα διαγράφουμε όσους περισσότερους χαρακτήρες μπορούμε, οι οποίοι ανήκουν στην σταθερή περιοχή του Ν, συνεχώς ανανεώνοντας τις σταθερές και διεγραμμένες περιοχές του (γραμμές 9-13) 2. Έπειτα αφαιρούμε όλους τους κόμβους για τους οποίους η εισαγώμενη περιοχή του προκατόχου τους μαζί με την δικιά τους σταθερή περιοχή βρίσκονται εξ ολοκλήρου μέσα στην περιοχή προς διαγραφή (γραμμές 14-19) 1. Όλες οι προηγούμενες διαγραφές στους κόμβους αυτούς συγχωνεύονται μέσα στην διεγραμμένη περιοχή του Ν, και η εισαγώμενη περιοχή του Ν τίθεται ως η εισαγώμενη περιοχή του τελευταίου κόμβου που αφαιρέθηκε 3. Μετά διαγράφουμε όσους περισσότερους χαρακτήρες μπορούμε από την εισαγώμενη περιοχή του Ν (γραμμές 20-21) 4. Αν υπάρχουν ακόμα χαρακτήρες για διαγραφή, τους αφαιρούμε από την σταθερή περιοχή του επόμενου κόμβου (γραμμές 22-24) 5. Τέλος, αν ο Ν δεν περιέχει καθόλου αλλαγές, τον συγχωνεύουμε με τον επόμενο κόμβο (γραμμές 25-30) Αλγόριθμος 2: KMN-DELETE 1 Skip a l l nodes f o r which pos [ node ] + node. k + node. k <= d e l p o s 2 node < f i r s t node f o r which t h e above c o n d i t i o n does not hold 3 i f pos [ node ] + node. k > d e l p o s + l e n then 4 Add a node new b e f o r e node 5 new. k < d e l p o s pos [ node ] 6 new.m < l e n 7 new. n < 0 8 node. k < node. k new. k l e n 9 e l s e 10 d < min{ len, pos [ node ] + node. k d e l p o s } 11 l e n < l e n d 12 node. k < node. k d 13 node.m < node.m + d 14 while n e x t [ node ]!= NIL and d >= node. n + n e x t [ node ]. k do 15 d < d node. n n e x t [ node ]. k 16 node. n < n e x t [ node ]. n 17 node.m < node.m + n e x t [ node ]. ms 18 Remove n e x t [ node ] 19 end i f 20 node. n < node. n min{d, node. n} 21 i f d > 0 then 22 n e x t [ node ]. k < n e x t [ node ]. k d 23 end i f 24 i f node.m = 0 and node. n = 0 and n e x t [ node ]!= NIL then 25 node. k < node. k + n e x t [ node ]. k 26 node.m < n e x t [ node ].m 27 node. n < n e x t [ node ]. n 28 Remove n e x t [ node ] 29 end i f 30 end i f 1 Η εισαγώμενη περιοχή ενός κόμβου μαζί με την σταθερή περιοχή του επόμενου πάντοτε αποτελούν ένα συνεχές τμήμα του text buffer 32

33 4.3.3 Σχόλια για την Πολυπλοκότητα των Αλγορίθμων 1 και 2 Οι αλγόριθμοι 1 και 2 έχουν γραμμική χρονική πολυπλοκότητα ως προς το μέγεθος της kmn-list. Αυτό είναι προφανές από την περιγραφή που δώσαμε πιο πάνω, αφού δεν υπάρχει κανένα σημείο αναδρομής ή επανάληψης στον κώδικα. Αντίθετα, και οι δύο αλγόριθμοι απαιτούν πρώτα να γίνει μια επιλογή των κόμβων που δεν επηρεάζονται από αλλαγές, και μετά σειριακά γίνεται η εξέταση των υπολοίπων, δηλαδή μια επανάληψη πάνω στην kmn-list. Υπάρχει, όμως, ένα σταθερό άνω φράγμα κάτω από το οποίο θα πρέπει να διατηρείται το μέγεθος της kmn-list στον αλγόριθμο που περιγράφεται στο [Jali82]. Οι Beetem και Beetem στο [Beet91] δίνουν τον αριθμό των 12 κόμβων ως ένα λογικό κατώφλι, που όταν το μέγεθος της kmn-list κρατείται κάτω από αυτό, οι αλγόριθμοι παραμένουν γραμμικοί ως προς το χρόνο εκτέλεσης, όπως αυτό συμπαιρένεται από τα πειράματά τους. Στο [Lahaa], όμως, ο Lahav υποστηρίζει ότι η kmn-list δεν περιέχει ποτέ περισσότερους από 2 κόμβους, λόγω του ότι στο Meddle η λεκτική ανάλυση ξεκινά κάθε 0.3 δευτερόλεπτα, και επιτυχημένη λεκτική ανάλυση εκφυλίζει την kmn-list σε έναν μόνο κόμβο. Αυτό, φυσικά, είναι καθαρά θέμα υλοποίησης, αφού η συμπεριφορά του Meddle θα είναι διαφορετική (κατά τον συγγραφέα του) εαν ξεκινάει η λεκτική ανάλυση μόνο όταν ανιχνευθεί κάποια αλλαγή στο κείμενο, παρά όταν αυτό γίνεται περιοδικά. 33

34

35 Κεφάλαιο 5 Αυξητική Λεκτική Ανάλυση 5.1 Γενικά Όπως αναφέραμε και στην παράγραφο 2.3, στην διαδικασία της λεκτικής ανάλυσης ο μεταγλωττιστής παράγει ένα ρεύμα (stream) από λεκτήματα (tokens) αναλύοντας το αρχικό πρόγραμμα. Συγκεκριμένα, για κάθε γλώσσα προγραμματισμού, τα λεκτήματα αυτά είναι τα τερματικά σύμβολα τις γραμματικής που την παράγει. Ο στόχος της αυξητικής συντακτικής ανάλυσης είναι να αναλύει κάθε φορά όσο λιγότερα λεκτήματα μπορεί, διατηρώντας πάντοτε ένα πλήρες και ορθό ρεύμα λεκτημάτων για το αλλαγμένο κείμενο. Για το σκοπό αυτό απαιτείται μια επανάληψη πάνω σε μια λίστα με τις τροποποιήσεις που έγιναν στον buffer από την τελευταία λεκτική ανάλυση του κειμένου (βλ. παράγραφο 4.2) και η ορθή ταυτοποίηση των λεκτημάτων τα οποία επηρεάστηκαν από τις αλλαγές. 5.2 Ταυτοποίηση λεκτημάτων Θα πρέπει πρώτα να πούμε ότι δε χρειάζεται όλα τα λεκτήματα που επηρεάζονται από μια αλλαγή να ανιχνευθούν ξανά, αφού είναι πιθανόν να μεταβληθεί μόνο η θέση τους μέσα στο text buffer (είτε πρόκειται για εισαγωγή είτε για διαγραφή χαρακτήρων) και τα περιεχόμενά τους να παραμείνουν αναλλοίωτα. Εντελώς αντίστροφα, είναι δυνατόν λεκτήματα που κείνται εκτός της αλλαγμένης περιοχής του κειμένου να χρειαστεί να ανιχνευθούν ξανά, όπως δείχνει το παρακάτω παράδειγμα: Παράδειγμα 3. Έστω ο παρακάτω κώδικας σε MiniBasic: l e t nn = 42; p r i n t n. Τα προφανή σφάλματα διορθώνονται από τον προγραμματιστή, και ο νέος κώδικας έχει την εξής μορφή: l e t n = 42; p r i n t n. Στις παρακάτω εικόνες φαίνεται το ρεύμα λεκτημάτων για τον αρχικό και τον αλλαγμένο κώδικα αντίστοιχα (οι συντεταγμένες (θ,μ) συμβολίζουν την θέση και το μήκος κάθε τερματικού συμβόλου αντίστοιχα). Το δεύτερο λέκτημα έχει αλλάξει και χρειάζεται να ανιχνευθεί ξανά. Τα επόμενα 4 λεκτήματα έχουν αλλάξει θέσεις, αλλά δεν απαιτείται επανανίχνευση για κανένα από αυτά, αντίθετα με το επόμενο λέκτημα (το δεύτερο μισό της λέξης print ), το οποίο πρέπει να επανανιχνευθεί, παρόλο που δεν έχει αλλάξει καθόλου η περιοχή την οποία αυτό ορίζει. Αν ο αναλυτής μας δεν αναγνώριζε αυτή την περίπτωση, τότε θα άφηνε την λέξη print χωρισμένη σε δύο διαφορετικά λεκτήματα, δίνοντας μιαν εντελώς διαφορετική σημασιολογική ερμηνεία στο πρόγραμμά μας. 35

36 Σχήμα 5.1: Λίστα λεκτημάτων αρχικού κώδικα Σχήμα 5.2: Λίστα λεκτημάτων αλλαγμένου κώδικα 5.3 Ο αλγόριθμος αυξητικής λεκτικής ανάλυσης Η βασική ιδέα για τον αλγόριθμο αυξητικής λεκτικής ανάλυσης που περιγράφεται στο [Beet91] είναι να κοιτάμε κάθε φορά που ο λεκτικός αναλυτής καλείται αν βρισκόμαστε σεε σταθερή περιοχή. Αν όντως βρισκόμαστε σε σταθερή περιοχή και το τρέχον λέκτημα περιέχεται εξολοκλήρου σ αυτήν, μπορούμε με ασφάλεια να μετακινηθούμε στο επόμενο λέκτημα. Αν όχι, τότε ξεκινάμε να διαβάζουμε λεκτήματα και διαχωριστές (separators) μέχρι να βρεθούμε ξανά σε σταθερή περιοχή. Ο αλγόριθμος αυξητικής λεκτικής ανάλυσης επιτελεί δυο λειτουργίες: αφ ενός τον έλεγχο και την επανανίχνευση λεκτημάτων από το ρεύμα λεκτημάτων του text buffer, και αφ εταίρου την τροποποίηση της kmn-list, έτσι ώστε οι αλλαγές σύμφωνα με τα νεοανιχνευθέντα λεκτήματα να αποτυπώνονται ορθά για να κρατείται πάντα σε συμφωνία με το κείμενο. Για την επιτέλεση των λειτουργιών αυτών επινοήθηκαν δύο ξεχωριστοί αλγόριθμοι που υλοποιούνται από τις αντίστοιχες συναρτήσεις (INC-SCAN για την πρώτη περίπτωση και KMN-MOVE για την δεύτερη), και οι οποίες καλούμενες σειριακά η μια μετά την άλλη υλοποιούν τον γενικευμένο αλγόριθμο αυξητικής λεκτικής ανάλυσης Η συνάρτηση INC-SCAN Η συνάρτηση INC-SCAN έχει σαν ορίσματα μια λίστα τροποποιήσεων κειμένου στη μορφή της kmnlist και μια λίστα από λεκτήματα. Στη μεταβλητή node αποθηκεύεται η εκάστοτε κεφαλή της kmn-list, στην μεταβλητή shift η τιμή σύμφωνα με την οποία η θέση των λεκτημάτων θα πρέπει ν αλλάξει (για παράδειγμα τιμή +42 σημαίνει ότι τα λεκτήματα θα πρέπει να μεταφερθούν 42 θέσεις προς το τέλος του text buffer ενώ αντίστοιχα τιμή -42 σημαίνει ότι τα λεκτήματα θα πρέπει να μεταφερθούν 42 θέσεις προς την αρχή του text buffer) και η μεταβλητή last δείχνει το τελευταίο λέκτημα το οποίο δεν χρειάζεται ανίχνευση. Η μεταβλητή last αρχικοποιείται στο NIL, δείχνοντας ότι όλα τα λεκτήματα είναι υποψήφια για επανανίχνευση. Κατ αρχήν, υπενθυμίζουμε ότι η kmn-list είναι συμπαγής, δηλαδή κάθε κόμβος εκτός του τελευταίου, εμπεριέχει κάποιες αλλαγές. Έτσι, ξεκινάμε με την αξιολόγηση όλων των αλλαγών στον πρώτο κόμβο της kmn-list, ξεπερνώντας όλα τα λεκτήματα τα οποία βρίσκονται στην σταθερή περιοχή του. Ορισμός 5.1: Ένα λέκτημα token λέμε ότι βρίσκεται στην σταθερή περιοχή του κόμβου node, όταν pos[token] + length[token] + shif t < pos[node] + node.k Συνεχίζουμε επανανιχνεύοντας λεκτήματα και τοποθετώντας τα μέσα σε μια προσωρινή λίστα, έτσι ώστε αν οι τροποποιήσεις εμπεριέχουν λεκτικά λάθη να μην επηρεαστεί η αρχική λίστα λεκτημάτων (γραμμές 7-17). Η μεταβλητή last περιέχει το τελευταίο λέκτημα που δεν χρειάζεται να επανανιχνευθεί, δηλαδή τυχόν διαχωριστές (delimiters - αν υπάρχουν) μπορεί να επανανιχνευθούν, έστω και αν περιέχονται μέσα στην σταθερή περιοχή κάποιου κόμβου. Παρόλο που με μια πρώτη ματιά φαίνεται ότι η ανάγκη αυτή για επανανίχνευση των διαχωριστών επισύρει κόστος στην απόδοση του αλγορίθμου, εντούτοις απλοποιεί σε μεγάλο βαθμό τον γενικευμένο αλγόριθμο αυξητικής λεκτικής ανάλυσης, και τελικά αυξάνει την απόδοσή του. Η ανίχνευση ξεκινά από τον πρώτο χαρακτήρα που βρίσκεται αμέσως μετά το last (γραμμές 8-12). 36

37 Μετά την ανίχνευση των λεκτημάτων, αυτά προστίθενται στην προσωρινή λίστα, μέχρις ώτου να φτάσουμε ξανά σε κάποια σταθερή περιοχή (γραμμές 13-17). Εδώ ο έλεγχος παραδίδεται στην συνάρτηση KMN-MOVE, η οποία επιστρέφει τον αριθμό των θέσεων στο text buffer θα πρέπει να μετακινηθεί το κάθε λέκτημα (περισσότερες πληροφορίες για την KMN-MOVE στην παράγραφο ) Πριν τα νέα λεκτήματα συγχωνευθούν με την λίστα, στις γραμμές του αλγορίθμου περιγράφεται πώς ακριβώς τα λεκτήματα τα οποία ακυρώθηκαν από τις πρόσφατες αλλαγές αφαιρούνται: αρκεί να διαγραφούν όλα τα λεκτήματα που είναι διάδοχοι του last και το τέλος τους βρίσκεται αμέσως πριν την νέα θέση του λεκτικού αναλυτή. Επίσης χρειάζεται και μια μετάφραση της θέσης αυτής, αφού δίνεται σε αναφορά με το τρέχον text buffer, ενώ τα λεκτήματα προς διαγραφή δείχνουν τις θέσεις τους αναφορικά με τον παλιό buffer. Το τελευταίο σκέλος του αλγορίθμου είναι η συγχώνευση της προσωρινής λίστας με το αρχικό ρεύμα λεκτημάτων, αντικαθιστώντας τα λεκτήματα που διαγράφηκαν με αυτά της προσωρινής λίστας (γραμμές 20-21). Ο αλγόριθμος επιστρέφει ξανά στο πρώτο βήμα χρησιμοποιώντας αυτή τη φορά τον καινούριο kmn-κόμβο, μέχρις ώτου όλες οι αλλαγές να εφαρμοστούν, είτε μέχρι να προκύψει σφάλμα κατά τη διαδικασία της λεκτικής ανάλυσης. Επιτυχημένη λεκτική ανάλυση επαναφέρει την kmn-list στην αρχική της κατάσταση, έτσι ώστε ο μοναδικός απομένων κόμβος να μην περιέχει καθόλου αλλαγές, όταν δηλαδή οι διεγραμμένες και εισαγώμενες περιοχές του κόμβου είναι ίσες με μηδέν. Τυχόν σφάλμα της λεκτικής ανάλυσης προκαλεί την ακύρωση της λειτουργίας του αλγορίθμου αμέσως μετά την επιστροφή του λεκτικού αναλυτή με εσφαλμένο αποτέλεσμα, έτσι ώστε οι kmn-κόμβοι που περιέχουν τις επόμενες αλλαγές να μην καταναλωθούν από τη διαδικασία. Αλγόριθμος 3: INC-SCAN 1 node < head [ k m n l i s t ] 2 s h i f t < 0 3 l a s t < NIL 4 repeat 5 f o r a l l t o k e n in t o k e n l i s t such t h a t t o k e n in s t a b l e [ node ] do 6 pos [ t o k e n ] < pos [ t o k e n ] + s h i f t 7 l a s t < t o k e n 8 end f o r 9 C r e a t e an empty t o k e n l i s t t e m p l i s t 10 i f l a s t!= NIL then 11 S t a r t s c a n n i n g a t pos [ l a s t ] + l e n g t h [ l a s t ] 12 e l s e 13 S t a r t s c a n n i n g a t p o s i t i o n 0 14 end i f 15 repeat 16 Read a new t o k e n 17 Append t o k e n to t e m p l i s t 18 s h i f t < KMN MOVE( pos [ t o k e n ] + l e n g t h [ t o k e n ], node, s h i f t ) 19 u n t i l t o k e n in s t a b l e [ node ] 20 o l d s c a n p o s < pos [ t o k e n ] + l e n g t h [ t o k e n ] s h i f t 21 Remove a l l t o k e n s a f t e r l a s t t h a t end b e f o r e o l d s c a n p o s 22 Merge t e m p l i s t i n t o t o k e n l i s t a f t e r l a s t 23 l a s t < l a s t scanned t o k e n 24 u n t i l t h e k m n l i s t c o n t a i n s no changes or a s c a n n e r e r r o r has o c c u r e d 37

38 5.3.2 Η συνάρτηση KMN-MOVE Η συνάρτηση KMN-MOVE καλείται από την INC-SCAN μόλις ανιχνεύσουμε κάποιο καινούριο λέκτημα. Έχει την ευθύνη να θέτει τον τρέχοντα kmn-κόμβο να είναι αυτός που εκτείνει την καινούρια θέση του λεκτικού αναλυτή. Για να πραγματοποιηθεί αυτή η ανάθεση, δεν αρκεί μία μόνο επανάληψη πάνω στην kmn-list. Συγκεκριμένα, όλοι οι κόμβοι που βρίσκονται πριν από τη θέση που περνάμε σαν όρισμα στην KMN-MOVE θεωρούνται ως καταναλωμένοι, δηλαδή ότι οι αλλαγές που αυτοί επιφέρουν έχουν εφαρμοστεί. Τότε η KMN-MOVE κάνει reset τον τρέχοντα κόμβο και συγχωνεύει τις αλλαγές που ο επόμενος αντιπροσωπεύει μ αυτόν. Γι αυτόν ακριβώς τον λόγο ο κόμβος node δεν αλλάζει περιεχόμενα, αλλά κατά κάποιον τρόπο επεκτείνεται ώστε να περιέχει τους διάδοχούς του. Τέλος, η μεταβλητή shift ανανεώνει το περιεχόμενό της όσο οι kmn-κόμβοι καταναλώνονται. Αλγόριθμος 4: KMN-MOVE 1 while p o s i t i o n [ node ] + node. k + node. n <= pos do 2 s h i f t < s h i f t + node. n node.m 3 node. k < node. k + node. n 4 i f Next [ node ]!= NIL then 5 node. k < node. k + Next [ node ]. k 6 node.m < Next [ node ].m 7 node. n < Next [ node ]. n 8 e l s e 9 node.m < 0 10 node. n < 0 11 end i f 12 end while 13 r e t u r n s h i f t 5.4 Σχόλια για την πολυπλοκότητα των Αλγορίθμων 3 και 4 Από την παραπάνω ανάλυση, βλέπουμε αρχικά ότι επανανίχνευση χρειάζονται μόνο λεκτήματα τα οποία έχουν υποστεί τροποποιήσεις. Αυτό δεν είναι αντιπροσωπευτικό της πολυπλοκότητας των αλγορίθμων που μελετήσαμε, αφού για να αποφασίσουμε ποιά λεκτήματα χρειάζονται επανανίχνευση χρειάζεται να περιηγηθούμε πάνω από ολόκληρο το ρεύμα λεκτημάτων, και να μετακινήσουμε προς το τέλος τα λεκτήματα που μένουν. Αφού οι αλγόριθμοι αυξητικής λεκτικής ανάλυσης που παρουσιάσαμε έχουν γραμμική πολυπλοκότητα, γιατί χρειαζόμαστε στ αλήθεια την αυξητική λεκτική ανάλυση? Θεωρητικά, όντως η γραμμική πολυπλοκότητα είναι η χειρότερη που μπορούμε να πετύχουμε, αφού οι σειριακοί λεκτικοί αναλυτές βασίζουν τη λειτουργία τους σε ντετερμινιστικά πεπερασμένα αυτόματα, τα οποία έχουν πολυπλοκότητα γραμμικώς ανάλογη με το μέγεθος του κειμένου εισόδου. Από μερικά πρώτα πειράματα που διενέργησε ο Lahav στο πρόγραμμα που επινόησε για την υλοποίηση των αλγορίθμων αυτών, η απόδοση του αυξητικού λεκτικού αναλυτή σε σχέση με κάποιον σειριακό λεκτικό αναλυτή αυξάνεται καθώς αυξάνεται το μέγεθος του κειμένου εισόδου (βλ. εικόνα 5.3). Αυτό εξηγείται, αν σκεφτούμε ότι η λεκτική ανάλυση του κειμένου μας αποτελείται όχι μόνο από την ανίχνευση και διαχωρισμό λεκτημάτων, αλλά και από την δέσμευση μνήμης, διατήρηση του ρεύματος λεκτημάτων και άλλων δευτερεύοντων ζητημάτων, όπως για παράδειγμα την συντακτική υπογράμμιση των δεσμευμένων λέξεων. 38

39 Σχήμα 5.3: Διάγραμμα Χρόνων Απόκρισης Σειριακού και Αυξητικού Λεκτικού Αναλυτή 39

40

41 Κεφάλαιο 6 Αυξητική Συντακτική Ανάλυση 6.1 Γενικά Η διαδικασία της αυξητικής λεκτικής ανάλυσης είναι υπεύθυνη για την διατήρηση του ρεύματος λεκτημάτων στη σωστή κατάσταση (updated) με αποδοτικό τρόπο. Μετά από κάθε κλήση των συναρτήσεων που υλοποιούν τον αυξητικό λεκτικό αναλυτή, ο έλεγχος μεταφέρεται στον αυξητικό συντακτικό αναλυτή, ο οποίος φροντίζει να διατηρεί σε κάθε χρονική στιγμή το αφηρημένο συντακτικό δέντρο που κατασκευάζεται ισοζυγισμένο και ενημερωμένο. Για το σκοπό αυτό στη βιβλιογραφία χρησιμοποιούνται διάφορες δομές δεδομένων, όπως απλά και διπλά συνδεδεμένες λίστες ([WAGN98]). Η σημαντικότερη από τις δομές αυτές, επινοήθηκε από τον Lahav ([Lahaa]), ονομάζεται P-Tree (από το Parse Tree) και χρησιμοποιείται αποκλειστικά για την διατήρηση διαφόρων εκδόσεων του AST που φτιάχνει ο συντακτικός αναλυτής με σκοπό την αποδοτικότερη υλοποίηση των αλγορίθμων που αφορούν την αυξητική συντακτική ανάλυση. 6.2 Η δομή δεδομένων P-Tree Κατά τη διάρκεια της υπόλοιπης συζήτησής μας για τον αλγόριθμο αυξητικής συντακτικής ανάλυσης θα χρησιμοποιούμε δύο διαφορετικές ονομασίες για τα φύλλα του P-Tree αναλόγως σε ποιό κομμάτι του προγράμματος αναφερόμαστε: αν αναφερόμαστε στον λεκτικό αναλυτή θα λέμε για λεκτήματα, ενώ αν αναφερόμαστε στον συντακτικό αναλυτή θα λέμε για τερματικούς κόμβους. Παρά τα όσα έχουμε γενικά αναφέρει μέχρι στιγμής, χρειάζεται να περιγράψουμε λεπτομερώς την μορφή ενός P-Tree: είναι μια δομή δεδομένων, στον κάθε κόμβο της οποίας περιέχεται: Το τερματικό ή μη σύμβολο της γραμματικής που περιγράφει την γλώσσα προγραμματισμού μας, το οποίο ο συγκεκριμένος κόμβος αντιπροσωπεύει Τη θέση του αριστερότερου χαρακτήρα στον text buffer Το συνολικό αριθμό των χαρακτήρων που αποτελούν το σύμβολο (μήκος) Την κατάσταση του λεκτικού αναλυτή αφότου το λέκτημα διαβαστεί (μόνο εάν πρόκειται περί τερματικό κόμβο) Την κατάσταση του συντακτικού αναλυτή πριν μετατοπίσει (shift) τον κόμβο Την κατάσταση του συντακτικού αναλυτή αφού μετατοπίσει τον κόμβο Το look-ahead σύμβολο που χρησιμοποιήθηκε για να αποφασιστεί αν ο συγκεκριμένος κόμβος χρειάζεται μετατόπιση ή όχι Δείκτες προς τους γονείς, τα αδέλφια, το πρώτο και το τελευταίο παιδί του κόμβου Από την παραπάνω περιγραφή μπορούμε να διακρίνουμε τη μορφή ακριβώς του P-Tree: δεν είναι ένα δέντρο, αλλά ένα διατεταγμένο συντακτικό δάσος, δηλαδή ένα σύνολο από συντακτικά ορθά δέντρα 41

42 (ρεύμα λεκτημάτων), τα οποία είναι υποψήφια για επαναχρησιμοποίηση ως μέρη του καινούριου δέντρου που κατασκευάζεται. Ένα πρόβλημα με το οποίο βρισκόμαστε αντιμέτωποι αμέσως είναι το πώς θα διατηρούμε το ρεύμα των δέντρων που φτιάχνονται κατά τη διάρκεια της συντακτικής ανάλυσης του προγράμματος. Μια κομψή λύση δόθηκε στο [WAGN98], και αφορά την αποθήκευση δύο μόνιμων κόμβων (επίσης ονομαζόμενοι ως φρουροί - sentinels), ενός για την αρχή του ρεύματος (BOS - Begin Of Stream) και ενός για το τέλος (EOS - End Of Stream). Οι δείκτες-αδέλφια καθενός από τους κόμβους μέσα στο ρεύμα δείχνουν στους άμεσους γείτονες του καθενός, έτσι διευκολύνεται η υλοποίησή του με μια απλά συνδεδεμένη λίστα. Κόμβοι που είναι είτε εσωτερικοί είτε φύλλα των δέντρων του συντακτικού δάσους δείχνουν στα αδέλφια τους με τον προαναφερθέν τρόπο και δεν βρίσκονται μέσα στο ρεύμα, ενώ αντίθετα κόμβοι που είναι οι ρίζες των δέντρων του συντακτικού δάσους βρίσκονται μέσα στο ρεύμα και τα αδέλφια τους είναι ρίζες άλλων δέντρων. Τέλος, η δομή P-Tree περιέχει και πληροφορία αναφορικά με την λίστα λεκτημάτων, όπως την παράγει ο λεκτικός αναλυτής. Η λίστα αυτή χρειάζεται τόσο για την αυξητική λεκτική ανάλυση, όπως αυτή περιγράφεται από τους αλγορίθμους της ενότητας 5, όσο και για την αυξητική συντακτική ανάλυση, όπως θα δούμε παρακάτω 1. Το πρώτο λέκτημα στη λίστα μπορεί να βρεθεί παίρνοντας τον κόμβο ο οποίος στο ρεύμα των συντακτικών δέντρων ακολουθεί αμέσως τον BOS και κατεβαίνοντας το αριστερό του κλαδί, μέχρι να βρεθεί τερματικός κόμβος (δηλαδή φύλλο). Η διαδικασία εύρεσης του επόμενου λεκτήματος εξαρτάται από το αν ο τρέχον κόμβος έχει κάποιον άμεσο διάδοχο. Σε μια τέτοια περίπτωση αυτός είναι το επόμενο λέκτημα στη λίστα μας. Αλλιώς, ο τρέχον κόμβος είναι το δεξιότερο παιδί του γονέα του. Για να βρούμε το επόμενο λέκτημα θα πρέπει να μετακινηθούμε προς τα πάνω στο δέντρο, μέχρις ώτου ένας κόμβος με διάδοχο βρεθεί, οπότε θα πάρουμε τον πρώτο τερματικό κόμβο που θα βρούμε κινούμενοι στο αριστερότερο κλαδί του. Ένα ολοκληρωμένο συντακτικό δέντρο αναπαρίσταται από το ρεύμα που περιέχει τον κόμβο BOS, ακολουθούμενο από την ρίζα του συντακτικού δέντρου και τελειώνει με τον κόμβο EOS. Αν εμφανιστεί σφάλμα κατά την συντακτική ανάλυση, η δομή P-Tree εξακολουθεί να περιέχει ένα ορθό ρεύμα από τερματικά τα οποία ακόμη δεν έχουν μετατοπιστεί και από μη τερματικά τα οποία έχουν μετατοπιστεί προτού εμφανιστεί το σφάλμα. Έτσι, το ρεύμα μπορεί να χρησιμοποιηθεί για συντακτική επαν-ανάλυση μετά τη διόρθωση του σφάλματος. Παράδειγμα 4 Έστω ότι ο συντακτικός μας αναλυτής συναντά το string abb και θα το αναγάγει (reduce) στο μη τερματικό σύμβολο C, βασιζόμενος στο look-ahead σύμβολο c. Ένας νέος μη τερματικός κόμβος για το C αντικαθιστά τους κόμβους στο ρεύμα, οι οποίοι γίνονται τα παιδιά του. Σχήμα 6.1: Υλοποιώντας reduction σε P-Tree 1 Στο Meddle η επιλογή αυτή οδήγησε στην μη χρησιμοποίηση των αλγορίθμων της ενότητας 5. 42

43 6.3 Ο αυξητικός συντακτικός αναλυτής Γενικά Η επινόηση της δομής P-Tree που περιγράφηκε στις προηγούμενες ενότητες είναι κρίσιμη για την ευκολότερη η υλοποίηση του αυξητικού συντακτικού αναλυτή. Μέχρι τώρα είδαμε ότι η δομή αυτή είναι ουσιαστικά ένα δάσος από διάφορες εκδόσεις του συντακτικού δέντρου που παράγεται κατά τη διάρκεια της συντακτικής ανάλυσης, όπου αναπαρίσταται το εξεταζόμενο ρεύμα λεκτημάτων, όπως αυτό εξάγεται από τον λεκτικό αναλυτή. Έτσι ήρθε η ώρα να δούμε πώς ακριβώς δουλεύει ο αυξητικός συντακτικός αναλυτής και γιατί η δομή P-Tree κάνει την υλοποίησή του ευκολότερη Υλοποίηση του αυξητικού συντακτικού αναλυτή Ένας συντακτικός αναλυτής, όπως περιγράφεται λεπτομερώς στο [Aho86], δεν είναι τίποτε άλλο από ένα αυτόματο στοίβας, όπου λεκτήματα τα οποία διαβάζονται μπαίνουν στην στοίβα για να υποστούν επεξεργασία (shift - ολίσθηση ή reduce - ελάττωση). Έτσι και στην δικιά μας περίπτωση, η στοίβα αυτή υλοποιείται κρατώντας ένα δείκτη σε ένα κόμβο του ρεύματος λεκτημάτων, ο οποίος συμβολίζει την κορυφή της στοίβας. Όσοι κόμβοι βρίσκονται στα αριστερά του (δηλαδή προς την αρχή του ρεύματος) βρίσκονται μέσα στη στοίβα, ενώ όσοι κόμβοι βρίσκονται στα δεξιά του (δηλαδή προς το τέλος του ρεύματος) είναι λεκτήματα τα οποία δεν έχουν ακόμα υποστεί συντακτική ανάλυση (αν πρόκειται για τερματικούς κόμβους) ή ρίζες των δέντρων τα οποία θα λάβουμε υπόψην για επαναχρησιμοποίηση. Εδώ αρχίζει να φαίνεται ο λόγος της χρησιμοποίησης της δομής P-Tree αντί μιας συμβατικής απλά συνδεδεμένης λίστας, αφού οι δύο στοίβες που περιγράφουν οι Jalili και Gallier στο [Jali82] δεν χρειάζεται να υλοποιηθούν, γεγονός που απλοποιεί κατά πολύ τον αλγόριθμό μας. Μετά το αρχικό πέρασμα, το ρεύμα που αποτελεί το P-Tree αποτελείται από τερματικούς κόμβους μόνο, οι οποίοι αντιστοιχούν στο ανιχνευμένο ρεύμα λεκτημάτων. Στη συνέχεια, ο συντακτικός αναλυτής ενεργεί ακριβώς όπως οι παραδοσιακοί σειριακοί συντακτικοί αναλυτές: κάθε λέκτημα λαμβάνεται υπόψην ως το look-ahead σύμβολο για τα λεκτήματα που προηγούνται από αυτό, και μόλις όλες οι αναγωγές (reductions) πραγματοποιηθούν και το ανιχνευμένο κείμενο είναι συντακτικώς ορθό, αυτό πιέζεται προς τα κάτω στη στοίβα (αυτό υλοποιείται αυξάνοντας τον δείκτη του συντακτικού αναλυτή έτσι ώστε να δείχνει στον επόμενο κόμβο στο ρεύμα). Η ελάττωση μιας συμβολοσειράς (string) σε ένα μη τερματικό σύμβολο είναι επίσης εύκολη: δημιουργούμε απλώς έναν νέο κόμβο που περιέχει την τιμή του μη τερματικού συμβόλου στο οποίο επιθυμούμε να αναγάγουμε την συμβολοσειρά. Όπως φαίνεται και στο παράδειγμα 6.2, το πρώτο και το τελευταίο παιδί του νέου κόμβου τίθενται ως ο αριστερότερος και ο δεξιότερος κόμβος της συμβολοσειράς αντίστοιχα. Στο τέλος η συμβολοσειρά αφαιρείται από το ρεύμα, θέτοντας τους αμέσως προηγούμενους και επόμενους κόμβους της να δείχνουν στον νέο κόμβο, υλοποιώντας έτσι την αντικατάσταση της συμβολοσειράς από το τερματικό σύμβολο. Μπορούμε πλέον να δικαιολογήσουμε πλήρως το γιατί επιλέχθηκε η δομή των P-Trees για την υλοποίηση του αυξητικού συντακτικού αναλυτή. Κατ αρχήν, χρησιμοποιώντας τη δομή αυτή μπορούμε να υλοποιήσουμε αποδοτικά την στοίβα που περιγράφει τη λειτουργία του συντακτικού αναλυτή μας, απλοποιώντας μάλιστα αρκετά τους αρχικούς αλγόριθμους που προτάθηκαν για το σκοπό αυτό. Επιπλέον, όπως είδαμε και πιο πάνω, με τη δομή αυτή οι μόνοι δείκτες που χρειάζονται ανανέωση και αλλαγή είναι αυτοί που συνδέουν τα παιδιά κάθε κόμβου που κατέχουν κάποια ειδική θέση στο ρεύμα (είτε είναι πρώτα είτε τελευταία - τα ενδιάμεσα δεν επηρεάζονται), κάνοντας την υλοποίηση καθαρότερη και πιο εύκολη στην κατανόηση. Παρατηρούμε ότι οι δομές των δέντρων που έχουν σαν ρίζα τους κόμβους των συμβολοσειρών δεν αλλάζουν καθόλου, όπως δεν αλλάζει ούτε η σειρά των κόμβων μέσα στην ίδια τη συμβολοσειρά. Το μόνο που αλλάζει είναι η σημασιολογία της σειράς, δηλαδή αντί κάθε κόμβος να έχει δείκτες προς τον προηγούμενο και τον επόμενο κόμβο του ρεύματος, τώρα δείχνει προς το προηγούμενο και επόμενο παιδί του νέου δέντρου-ρίζας. 43

44 6.4 Επαναχρησιμοποίηση Δέντρων Οι σειριακοί συντακτικοί αναλυτές, κάθε φορά που θα κληθούν από το μεταγλωττιστή να αναλύσουν ένα αρχείο, φτιάχνουν από την αρχή το συντακτικό δέντρο, μη λαμβάνοντας υπόψην το υπάρχον. Για να έχει ένας συντακτικός αναλυτής αυξητικό χαρακτήρα, είναι προφανές ότι πρέπει οι ενέργειές του να στηρίζονται στην τρέχουσα και τις προηγούμενες εκδόσεις του συντακτικού δέντρου που έχει παραχθεί από το συγκεκριμένο ρεύμα λεκτημάτων. Έτσι, φτάνουμε στο πιο σημαντικό από τα χαρακτηριστικά που προσδίδει η δομή P-Tree στον συντακτικό μας αναλυτή, που είναι η επαναχρησιμοποίηση δέντρων. Η καρδιά, λοιπόν, του αλγορίθμου αυξητικής συντακτικής ανάλυσης είναι η επαναχρησιμοποίηση των AST s που φτιάχνονται κατά τη διάρκεια επεξεργασίας του ρεύματος λεκτημάτων. Ο στόχος του αλγορίθμου είναι να ταυτοποιήσει όσα περισσότερα δέντρα από το ρεύμα μπορεί, τα οποία θα προωθήσει πάνω στη στοίβα χωρίς να εξετάσει την εσωτερική δομή τους. Με τον τρόπο αυτό, ο αυξητικός συντακτικός αναλυτής κερδίζει κρίσιμους πόρους που στις μέχρι τώρα προσεγγίσεις χρησιμοποιούνταν για φτιάξιμο των συντακτικών δέντρων από την αρχή, έστω και αν η μόνη διαφορά με το προηγούμενο ήταν ένα μόνο σύμβολο. Στην Πρόταση 3.1, παρουσιάζεται ο εξής απλός κανόνας για την επαναχρησιμοποίηση δέντρων: Ένας μη τερματικός κόμβος που αναπαριστά ένα υποδέντρο που φτιάχτηκε κατά τη διάρκεια προηγούμενης συντακτικής ανάλυσης μπορεί να μετακινηθεί αμέσως αν η κατάσταση του συντακτικού αναλυτή και του look-ahead συμβόλου του ταιριάζουν με τις αντίστοιχες της προηγούμενης συντακτικής ανάλυσης. Η συνθήκη αυτή, παρόλο που είναι ικανή, δεν είναι αναγκαία για να μπορούμε να επαναχρησιμοποιήσουμε το AST που φτιάχτηκε σε προηγούμενο πέρασμα του συντακτικού αναλυτή μας. Πράγματι, στο [WAGN98] αναφέρεται ότι ο μη τερματικός κόμβος μπορεί να μετακινηθεί ακόμα και αν το look-ahead σύμβολο με το οποίο θα προσδιορίσουμε την κίνησή του έχει αλλάξει, φτάνει να βρίσκεται μέσα στο σύνολο των look-ahead συμβόλων της κατάστασης του συντακτικού αναλυτή πριν την συντακτική ανάλυση. 2 Στην περίπτωση που η παραπάνω συνθήκη για επαναχρησιμοποίηση δέντρων δεν ικανοποιείται για κάποιο συγκεκριμένο κόμβο, τότε το δέντρο που έχει σαν ρίζα το συγκεκριμένο κόμβο χρειάζεται να διασπαστεί. Ανάλογα με το λόγο για τον οποίο η συνθήκη δεν ικανοποιείται, έχουμε την Αριστερή Διάσπαση (Α.Δ.) και την Δεξιά Διάσπαση (Δ.Δ) Α.Δ. Όλοι οι μη τερματικοί κόμβοι του αριστερότερου κλαδιού (δηλαδή όλοι εκτός από τα φύλλα) αφαιρούνται, και η ρίζα του δέντρου (η οποία κείται εντός του ρεύματος) αντικαθίστανται από μια συμβολοσειρά που αποτελείται από τα παιδιά των αφαιρούμενων κόμβων, με σειρά από τα αριστερά προς τα δεξιά. Δ.Δ. Όλοι οι μη τερματικοί κόμβοι του δεξιότερου κλαδιού αφαιρούνται. Η ρίζα του δέντρου αντικαθίσταται από μια συμβολοσειρά που αποτελείται από τα παιδιά των αφαιρουμένων κόμβων, από τα αριστερά προς τα δεξιά. Το παρακάτω παράδειγμα δείχνει ακριβώς αυτό: Παράδειγμα 5 Στις εικόνες που ακολουθούν φαίνεται μια αριστερή και μια δεξιά διάσπαση δέντρου. Παρατηρούμε πώς οι κόμβοι που αφαιρούνται τοποθετούμενοι από αριστερά προς τα δεξιά αντικαθιστούν τη ρίζα του δέντρου. 2 Κατ ακρίβειαν στο Meddle χρησιμοποιείται η συνθήκη των Jalili και Gallier, αφού όπως είπαμε πριν στηρίζει τη λειτουργία του στην έξοδο του προγράμματος Bison, το οποίο δεν παρέχει καμία πληροφορία για τα look-ahead σύμβολα. 44

45 Σχήμα 6.2: Αριστερή Διάσπαση Σχήμα 6.3: Δεξιά Διάσπαση Οι διαδικασίες της Αριστερής και Δεξιάς Διάσπασης, αναφέρονται στο [Jali82] ως REPLACE και UNDO-REDUCTIONS αντίστοιχα, όμως η χρήση καθεμιάς από αυτές δεν καθορίζεται σαφώς. Για να γίνει πιο ξεκάθαρη η εφαρμογή τους, στο [Lahaa] γίνονται οι δύο ακόλουθες παρατηρήσεις (χρησιμοποιούνται οι συμβολισμοί και οι αποδείξεις από την αρχική δημοσίευση του Lahav). Πρόταση 6.1: Έστω α 1,..., α n (V T V N ) + συμβολοσειρές σε μιαν LR(1) γραμματική G = (V T, V N, P, S). Αν ο συντακτικός αναλυτής εκτελέσει το σύνολο των αναγωγών (reductions) α 1 α 2... α n, τότε η κατάστασή του πριν μετακινήσει (shift) το αριστερότερο σύμβολο κάθε συμβολοσειράς α i είναι το ίδιο. Απόδειξη : Έστω σ i το πρώτο σύμβολο της συμβολοσειράς α i και s η κατάσταση του συντακτικού αναλυτή πριν μετακινήσει το σ i. Πρωτού ο συντακτικός αναλυτής μετακινήσει το αριστερότερο σύμβολο μέσα στην συμβολοσειρά α i+1, την οποία δείχνει το σ i+1 θα πρέπει να εξαγάγει όλα τα σύμβολα και τις καταστάσεις που ανταποκρίνονται στο μέρος της συμβολοσειράς στην α i το οποίο ορίζεται από εκείνο το σύμβολο. Λόγω της ορθότητας του αλγορίθμου συντακτικής ανάλυσης, και από τη στιγμή που τόσο το σ i όσο και το σ i+1 βρίσκονται στο αριστερότερο κλαδί του δέντρου, το τελευταίο σύμβολο που εξάγεται είναι το σ i. Αυτό επαναφέρει την κατάσταση του συντακτικού αναλυτή στην αρχική του κατάσταση πριν μετακινηθεί το σ i, έτσι το σ i+1 μετακινείται χρησιμοποιώντας την ίδια κατάσταση με το σ i. Η απόδειξη τελειώνει ανάγοντας τα πιο πάνω στο πλήθος των συμβόλων στο αριστερότερο κλαδί. 45

46 Πρόταση 6.2: Έστω α 1,..., α n (V T V N ) + συμβολοσειρές σε μιαν LR(1) γραμματική G = (V T, V N, P, S), και A 2,..., A n+1 μη τερματικά σύμβολα της γραμματικής αυτής. Αν ένας συντακτικός αναλυτής εκτελέσει το σύνολο των αναγωγών α 1 α 2 A 2... α n A n A n+1, τότε όλες αυτές οι αναγωγές γίνονται κοιτάζοντας το ίδιο look-ahead σύμβολο. Απόδειξη : Για τους σκοπούς της απόδειξης θα θεωρήσουμε την πρώτη αναγωγή, α 1 α 2 A 2. Η αναγωγή αυτή γίνεται βάσει του πρώτου συμβόλου το οποίο ακολουθεί το α 1. Τότε το A 2 αντικαθιστά μια υποσυμβολοακολουθία του α 1, η οποία τερματίζει στο δεξιότερο σύμβολο της συμβολοακολουθίας. Το επόμενο τερματικό σύμβολο τότε, δεν έχει αναχθεί ή μετακινηθεί, ούτε κάποιο άλλο τερματικό σύμβολο παράχθηκε πριν από αυτό. Εντελώς ανάλογα, το δεξιότερο σύμβολο στην παραγωγή του A i είναι το A i 1 για i 3, έτσι το επόμενο τερματικό σύμβολο που πρακτικά είναι το look-ahead σύμβολο παραμένει ίδιο. Σύμφωνα με την Πρόταση 6.1, έχουμε δύο περιπτώσεις που αφορούν τον έλεγχο της τρέχουσας κατάστασης του συντακτικού αναλυτή σε σχέση μ αυτήν που είναι φυλαγμένη στη ρίζα του δέντρου που είναι υποψήφιο για επαναχρησιμοποίηση. Εάν ταιριάζουν, το δέντρο δεν μπορεί να μετακινηθεί, και κανένας από τους κόμβους που βρίσκονται στο αριστερό κλαδί του δέντρου αυτού δεν θα πρέπει να μετακινηθεί, έτσι χρειάζεται να απορριφθεί ολόκληρο εκτός από το φύλλο, το οποίο είναι τερματικός κόμβος. Η Αριστερή Διάσπαση την οποία περιγράψαμε πιο πάνω, έχει αυτόν ακριβώς τον ρόλο. Διασπώντας το δέντρο στο αριστερό του κλαδί, δεν σημαίνει ότι αυτόματα μπορούμε να διασπάσουμε τα εσωτερικά δέντρα, και κυρίως η διαδικασία αυτή δεν αποτελεί καμία εγγύηση για την ορθότητα της επαναχρησιμοποίησής τους. Για να δούμε εάν μπορούν να γίνουν αυτές οι ενέργειες, χρειάζεται τα εσωτερικά αυτά εναπομείναντα δέντρα να ξαναπεράσουν από ανάλυση. Στην άλλη περίπτωση όπου οι δύο καταστάσεις ταιριάζουν, εάν το look-ahead σύμβολο έχει αλλάξει, τότε θα πρέπει να προκύψει μία από τις αναγωγές στις οποίες αναφέρεται το δεξιό κλαδί, όπως καθορίζει και η Πρόταση 6.2. Έτσι, οι αναγωγές αυτές, ακυρώνονται από την διαδικασία της Δεξιάς Διάσπασης. 6.5 Μεταφέροντας τις Αλλαγές στο Ρεύμα Λεκτημάτων Μέχρι τώρα είδαμε πώς υλοποιείται ο αυξητικός συντακτικός αναλυτής χρησιμοποιώντας τη δομή των P-Trees, και αναλύσαμε πώς δέχεται λεκτήματα από το ρεύμα λεκτημάτων, τα αναλύει και κάνει τις κινήσεις που πρέπει (shift/reduce). Το μόνο θέμα που έμεινε να προσεγγίσουμε πριν περιγράψουμε αναλυτικά τους αλγορίθμους είναι το πώς οι αλλαγές που γίνονται από τον αυξητικό συντακτικό αναλυτή μεταφέρονται πίσω στο ρεύμα λεκτημάτων, έτσι ώστε να παραμένει πάντα ενημερωμένο. Δέντρα υποψήφια για επαναχρησιμοποίηση μπορεί να είναι μόνο αυτά για τα οποία η παραγωγή λεκτημάτων από τη ρίζα τους δεν έχει μεταβληθεί από το τελευταίο πέρασμα του συντακτικού αναλυτή. Το ρεύμα λεκτημάτων, όμως, μεταβάλλεται μεταξύ δύο διαδοχικών κλήσεων του συντακτικού αναλυτή, αλλιώς δεν θα υπάρχει ανάγκη για επανάκλησή του. Το τελευταίο βήμα που θα κάνουμε πριν περιγράψουμε λεπτομερώς τον αλγόριθμο αυξητικής συντακτικής ανάλυσης θα είναι να σχολιάσουμε τις αλλαγές αυτές και τις συνέπειές τους τόσο στο ρεύμα λεκτημάτων όσο και στον ίδιο τον συντακτικό αναλυτή μας. Τόσο στο [Jali82] όσο και στο [WAGN98] η ευθύνη για την τροποποίηση του συντακτικού δέντρου σαν άμεσο αποτέλεσμα των αλλαγών στο ρεύμα λεκτημάτων, αφήνεται στον ίδιο τον συντακτικό αναλυτή: στο πρώτο μέσω της διπλά συνδεδεμένης λίστας που υλοποιεί τον αυξητικό συντακτικό αναλυτή, και στο δεύτερο μέσω της ενδιάμεσης γλώσσας που επινοήθηκε στα [Wagn96] και [Wagn97] για την υλοποίηση ενός συντακτικού αναλυτή όπου το κατασκευαζόμενο AST κρατιέται πάντοτε ισοζυγισμένο και ενημερωμένο. Ο φυσικός τρόπος, όμως, θα ήταν οι αλλαγές αυτές στο συντακτικό δέντρο να γίνονται από τον λεκτικό και όχι το συντακτικό αναλυτή, αφού αυτός έχει πλήρη έλεγχο του ρεύματος λεκτημάτων. Όντως, στο [Lahaa] ακολουθείται αυτή η πιο φυσική προσέγγιση στο θέμα, δίνοντας δύο βασικά πλεονεκτήματα έναντι των προαναφερθέντων: 46

47 Δεν υπάρχει ανάγκη για φύλαξη περίπλοκων αρχείων με πληροφορίες για τα αλλαγμένα λεκτήματα μεταξύ περασμάτων του συντακτικού αναλυτή όπως γίνεται στο [WAGN98], όπου χρησιμοποιείται ειδικά διαμορφωμένο version control για καλύτερες επιδόσεις Η δομή P-Tree περιέχει σε κάθε χρονική στιγμή ένα χρησιμοποιήσιμο ρεύμα από κόμβουςλεκτήματα, γεγονός που δίνει ακόμα ένα πλεονέκτημα στη χρησιμοποίησής της έναντι της κλασσικής στοίβας για την υλοποίηση του συντακτικού αναλυτή. Το μεγαλύτερο από τα μειονεκτήματα της συγκεκριμένης προσέγγισης, είναι ότι αποφάσεις αναφορικά με το συντακτικό δέντρο (ποιά μη τερματικά σύμβολα θα αναχθούν/μετακινηθούν, ποιά lookahead σύμβολα θα χρησιμοποιηθούν κ.λπ.) παίρνονται αρκετά πρόωρα, πριν ακόμα ολόκληρο το σύνολο των αλλαγών μεταξύ συντακτικών αναλύσεων του κειμένου εξεταστεί. Παρόλο που αυτό δεν οδηγεί σε μη ορθά αποτελέσματα, εντούτοις σε αρκετές περιπτώσεις δημιουργεί μη βέλτιστη συμπεριφορά. Για παράδειγμα, ο αλγόριθμος αυξητικής συντακτικής ανάλυσης που περιγράφεται στο [WAGN98] και στο οποίο οι αλλαγές στο συντακτικό δέντρο γίνονται από τον συντακτικό αναλυτή, αναφέρεται ότι έχει πολυπλοκότητα πάντοτε O(t + s log N), ανεξάρτητα του κειμένου προς διαμόρφωση και της κατάστασης στην οποία βρίσκεται ο συντακτικός μας αναλυτής. Αντίθετα στο Meddle, όπως θα δούμε παρακάτω, η συμπεριφορά του αυξητικού συντακτικού αναλυτή φαίνεται να έχει λογαριθμικό χαρακτήρα, όμως παρουσιάζει ανωμαλίες σε μεγάλα αρχεία εισόδου. Οι αλλαγές στο ρεύμα λεκτημάτων μπορεί να είναι είτε εισαγωγές νέων είτε διαγραφές υπαρχόντων λεκτημάτων στο/από το ρεύμα. Από τη στιγμή που το P-Tree περιέχει μόνο τερματικούς κόμβους (για παράδειγμα αμέσως πριν το πρώτο πέρασμα του συντακτικού αναλυτή), το πέρασμα των αλλαγών στο ρεύμα είναι σχετικά απλό. Τα πράγματα αρχίζουν να περιπλέκονται στην περίπτωση που το P-Tree περιέχει και προηγούμενα συντακτικά δέντρα, έτσι δέντρα για τα οποία η παραγωγή έχει αλλάξει δεν αντιπροσωπεύουν ορθά το κείμενο που υπόκειται σε αλλαγές. Το επόμενο βήμα, είναι να παρουσιάσουμε τις διαδικασίες για εισαγωγή και διαγραφή κόμβων σε/από ένα πλήρως ή μερικώς συντακτικώς αναλυμένο ρεύμα. Πρώτα θα δούμε την διαδικασία DIVIDE όπως ακριβώς ορίζεται στο [Jali82]. Δοσμένου ενός τερματικού κόμβου (φύλλου του δέντρου) σε ένα συντακτικό δέντρο, η DIVIDE ελέγχει το μονοπάτι από την ρίζα προς τον συγκεκριμένο κόμβο, και αφαιρεί όλους τους κόμβους που βρίσκονται πάνω σ αυτό το μονοπάτι εκτός από το φύλλο. Στο ρεύμα προσθέτονται όλα τα παιδιά των αφαιρούμενων κόμβων, με σειρά από αριστερά προς δεξιά, όπως φαίνται στην εικόνα 6.4. Σχήμα 6.4: Το αποτέλεσμα εφαρμογής της συνάρτησης DIVIDE σε ένα συντακτικό δέντρο. Το δέντρο χωρίζεται από τη ρίζα στον τερματικό κόμβο d. Οι σκιασμένοι κόμβοι είναι αυτοί που αφαιρούνται. Παρόλο που στο [Jali82] παρουσιάζεται η περίπτωση των διασπάσεων από την ρίζα προς ένα τερματικό κόμβο μόνο, εντούτοις η διαδικασία DIVIDE μπορεί εύκολα να γενικευτεί ώστε να εκτελεί 47

48 διασπάσεις και σε εσωτερικούς (μη τερματικούς) κόμβους. Ο αλγόριθμος δουλεύει με τον ίδιο ακριβώς τρόπο με τον οποίο δουλεύει για τους τερματικούς κόμβους μόνο: στην ουσία φέρνει ένα κόμβο P-Tree μαζί με τα αδέλφια του στο ρεύμα απορρίπτοντας τους προγόνους του. Σειρά έχει η διαδικασία REMOVE-TOKENS, η οποία είναι υπεύθυνη για την διαγραφή λεκτημάτων από ένα P-Tree και περιγράφεται στον Αλγόριθμο 5. Από τον Αλγόριθμο 3 θυμόμαστε ότι ο λεκτικός αναλυτής χρειάζεται να αφαιρέσει όλα τα λεκτήματα που κείνται μετά το τελευταίο το οποίο δεν άλλαξε μέχρι την νέα θέση στην οποία αυτός βρίσκεται τη συγκεκριμένη χρονική στιγμή. Από τη στιγμή που η λίστα των λεκτημάτων ενσωματώνεται μέσα σε ένα P-Tree, χρειάζεται να συγκεκριμενοποιήσουμε πώς η διαγραφή αυτή επηρεάζει τόσο τα δέντρα στα οποία αυτά τα λεκτήματα περιλαμβάνονται, όσο και το ρεύμα αυτό καθεαυτό. Φυσικά, αν όλα τα προς διαγραφή λεκτήματα βρίσκονται πάνω στο ρεύμα και δεν έχουν συντακτικά αναλυθεί επιτυχώς, η διαγραφή τους είναι ένα απλό θέμα μετάθεσης των δεικτών των κόμβων του ρεύματος που βρίσκονται αμέσως πριν και μετά από αυτά, όπως είδαμε και στην προηγούμενη παράγραφο. Ο αλγόριθμος δέχεται σαν παράμετρους το πρώτο λέκτημα που χρειάζεται να αφαιρεθεί και την τελευταία θέση της διεγραμμένης περιοχής. Βάσει αυτής της πληροφορίας, ο αλγόριθμος αναγνωρίζει το τελευταίο λέκτημα που περιέχεται εντός της διεγραμμένης περιοχής (γραμμή 1). Για να διατηρηθεί το P-Tree έγκυρο, μπορούν να διαγραφούν κόμβοι που βρίσκονται πάνω στο ρεύμα, δηλαδή ένα δέντρο μέσα στο δάσος των P-Tree μπορεί είτε να διαγραφεί είτε να παραμείνει στην ολότητά του. Έτσι το επόμενο βήμα είναι να βρούμε το πρώτο και τελευταίο λέκτημα που χρειάζεται να διαγραφεί από το ρεύμα. Αυτό επιτυγχάνεται με τη χρήση της διαδικασίας DIVIDE (γραμμές 2-3). Τώρα, όλοι οι κόμβοι πάνω στο ρεύμα μεταξύ των first και last είναι ρίζες δέντρων που χρειάζεται να διαγραφούν στην ολότητά τους, έτσι ο αλγόριθμος τελειώνει αφαιρώντας τα από το ρεύμα (γραμμή 4). Αλγόριθμος 5: REMOVE-TOKENS 1 l a s t < t h e l a s t t o k e n f o r which pos [ l a s t ] + l e n g t h [ l a s t ] <= endpos 2 DIVIDE ( f i r s t ) 3 DIVIDE ( l a s t ) 4 D e l e t e a l l t r e e s on t h e s t r e a m from f i r s t to l a s t Η διαδικασία MERGE-TOKENS που περιγράφεται στον Αλγόριθμο 6 χρησιμοποιείται για την εισαγωγή λεκτημάτων μέσα σε ένα P-Tree. Η διαδικασία αυτή δέχεται σαν παράμετρους το λέκτημα αμέσως μετά το οποίο πρέπει να γίνει η εισαγωγή και μια λίστα με τα νέα λεκτήματα που θα εισαχθούν. Ξεκινά βρίσκοντας τον ψηλότερο πρόγονο του after που δεν επηρεάζεται άμεσα από τα νέα λεκτήματα, και έπειτα καλεί την γενικευμένη διαδικασία DIVIDE για τον συγκεκριμένο κόμβο. Τέλος, τα λεκτήματα εισαγάγονται μέσα στο ρεύμα στην θέση που καθορίζεται. Αλγόριθμος 6: MERGE-TOKENS 1 node < t h e h i g h e s t node f o r which a f t e r i s a r i g h t most d e s c e n d a n t 2 DIVIDE ( node ) 3 Merge t o k e n l i s t a f t e r node and b e f o r e n e x t [ node ] 6.6 Ο αλγόριθμος Αυξητικής Συντακτικής Ανάλυσης Μετά την περιγραφή της δομής P-Tree, των διαδικασιών MERGE-TOKENS, DIVIDE και REMOVE- TOKENS και του τρόπου με τον οποίο μπορούμε να επαναχρησιμοποιήσουμε κάποια AST s που παράγονται, μπορούμε πλέον να παρουσιάσουμε τον πλήρη αλγόριθμο αυξητικής συντακτικής ανάλυσης. Το σημαντικό είναι πως ο αλγόριθμος αυτός είναι βασισμένος σε έναν σειριακό LALR(1) συντακτικό αναλυτή, όπως για παράδειγμα κάποιον που μπορούμε εύκολα να φτιάξουμε με το μεταεργαλείο Bison, έτσι η υλοποίησή του είναι σχετικά απλή. Ο αυξητικός χαρακτήρας προσδίδεται από 48

49 την διαδικασία NEXT-TERMINAL, η οποία περιγράφεται στον Αλγόριθμο 7. Η διαδικασία αυτή καλείται όποτε ο συντακτικός αναλυτής ζητάει το επόμενο λέκτημα από το ρεύμα λεκτημάτων. Τότε η διαδικασία NEXT-TERMINAL βρίσκει τον πρώτο διαθέσιμο τερματικό κόμβο πάνω στο ρεύμα, καθώς χειρίζεται όλους τους μη τερματικούς κόμβους που βρίσκονται πριν από αυτόν. Η συνάρτηση δέχεται ένα όρισμα, το top, το οποίο περιγράφει την τρέχουσα κατάσταση του συντακτικού αναλυτή: είναι ένας δείκτης στον κόμβο του ρεύματος που αντιπροσωπεύει την αρχή της στοίβας η οποία υλοποιεί τον συντακτικό αναλυτή 3. Ξεκινά την λειτουργία της επαναληπτικά πάνω σε όλους τους κόμβους του ρεύματος των P-Trees. Χρησιμοποιώντας την παράμετρο top και την διαδικασία Next εξετάζουμε μόνο κόμβους που βρίσκονται πάνω στο ρεύμα, αφού τα αδέλφια κάθε κόμβου βρίσκονται και αυτά πάνω στο ρεύμα. Εάν ο προς εξέταση κόμβος είναι μη τερματικός, η συνάρτηση χρησιμοποιεί το αριστερότερο τερματικό του σαν look-ahead σύμβολο για να εκτελέσει όσες αναγωγές μπορεί (γραμμή 3). Τότε ο συντακτικός αναλυτής είναι έτοιμος να ελέγξει έναν μη τερματικό κόμβο για ολίσθηση: αν η κατάστασή του και το look-ahead σύμβολο ταιριάζουν με τα αντίστοιχα του προηγούμενου περάσματος του συντακτικού αναλυτή (γραμμές 4-9), ο κόμβος μετακινείται (γραμμές 7-9). Η μετακίνηση γίνεται προωθώντας τον δείκτη top στον μετακινούμενο κόμβο και θέτοντας την κατάσταση του λεκτικού αναλυτή σ αυτήν η οποία ανταποκρίνεται στον κόμβο 4. Εάν η κατάσταση είναι ίδια, αλλά έχουμε διαφορετικό look-ahead σύμβολο, τότε το δέντρο χρειάζεται να διασπαστεί στο δεξί του κλαδί (γραμμή 11), όπως επιβάλλει η Πρόταση 6.2. Σε άλλη περίπτωση, το δέντρο διασπάται στο αριστερό του κλαδί (γραμμή 14), βάσει της Πρότασης 6.1. Μετά την (αριστερή ή δεξιά ανάλογα) διάσπαση του δέντρου, τα συστατικά του θα εξεταστούν για επαναχρησιμοποίηση με τη σειρά 5. Αλγόριθμος 7: NEXT-TERMINAL 1 node < n e x t [ t o p ] 2 while node i s a non t e r m i n a l do 3 Do a l l r e d u c t i o n s basd on t h e l e f t most t e r m i n a l in t h e y i e l d of node 4 i f p r e v s t a t e [ node ] = s t a t e then 5 l a < t h e n e x t t e r m i n a l f o l l o w i n g t h e y i e l d of node 6 i f l o o k a h e a d [ node ] = l a then 7 t o p < node 8 s t a t e < n e x t s t a t e [ node ] 9 node < n e x t [ node ] 10 e l s e 11 node < RIGHT BREAKDOWN( node ) 12 end i f 13 e l s e 14 node < LEFT BREAKDOWN( node ) 15 end i f 16 end while 17 r e t u r n node Στην παρακάτω εικόνα φαίνεται η απόδοση του αυξητικού συντακτικού αναλυτή σε σχέση με έναν σειριακό, σε μια σειρά πειραμάτων που διενέργησε ο Lahav. 3 Στο [Lahaa] η συγκεκριμένη συνάρτηση εκτός από το top, περιγράφεται ώστε να επιδέχεται και μια δεύτερη παράμετρο, την state, η οποία είναι η τρέχουσα κατάσταση του συντακτικού αναλυτή. Κοιτάζοντας λιγάκι πιο προσεκτικά, βλέπουμε ότι η δεύτερη αυτή παράμετρος είναι όντως αχρείαστη, αφού περιγράφοντας την δομή P-Tree ορίσαμε και ένα πεδίο το οποίο κρατάει την κατάσταση του συντακτικού αναλυτή μετά την μετακίνηση του τρέχοντος κόμβου, έτσι δεν χρειάζεται να περαστεί σαν παράμετρος στην συνάρτησή μας αφού μπορεί να βρεθεί έμμεσα από την top 4 Κάθε κόμβος περιέχει τις καταστάσεις του συντακτικού αναλυτή αμέσως πριν και μετά μετακινηθεί. 5 Υποθέτουμε ότι οι διαδικασίες LEFT-BREAKDOWN και RIGHT-BREAKDOWN επιστρέφουν τον πρώτο κόμβο πάνω στο ρεύμα που προκύπτει από την εκτέλεσή τους 49

50 50 Σχήμα 6.5: Διάγραμμα Χρόνων Απόκρισης Σειριακού και Αυξητικού Συντακτικού Αναλυτή

51 Κεφάλαιο 7 Οι Αυξητικές Μέθοδοι στον Επεξεργαστή Κειμένου Meddle 7.1 Απόδοση Οι μέθοδοι αυξητικής λεκτικής και συντακτικής ανάλυσης που περιγράφονται στα δύο προηγούμενα κεφάλαια, σύμφωνα με το [Lahaa], εφαρμόζονται στον επεξεργαστή κειμένου Meddle. Στο παρακάτω σχήμα φαίνεται η συνολική απόδοση του αυξητικού λεκτικού και συντακτικού αναλυτή, σε σχέση με έναν σειριακό: Σχήμα 7.1: Διάγραμμα Συνολικών Χρόνων Απόκρισης Σειριακού και Αυξητικού Λεκτικού και Συντακτικού Αναλυτή Τα νούμερα αυτά προέκυψαν μετά την διενέργεια ελέγχων εισαγωγής και διαγραφής κειμένου στην αρχή, το μέσο και το τέλος αρχείων διαφορετικού μεγέθους. 7.2 Εφαρμογή των Μεθόδων Αυξητικής Λεκτικής και Συντακτικής Ανάλυσης Παρόλο που θεωρητικά φαίνεται ότι οι παραπάνω μέθοδοι βρίσκουν άψογη εφαρμογή στον Meddle, εντούτοις με προσεκτική μελέτη του κώδικα βρίσκουμε αρκετές αδυναμίες. Με μια πρώτη ματιά, η δομή kmn-list δεν φαίνεται ότι υλοποιείται πουθενά. Κοιτάζοντας προσεκτικότερα, βλέπουμε ότι το 51

52 μόνο που υλοποιείται πραγματικά είναι η δομή P-Tree, και πάνω της στηρίζεται τόσο η αυξητική λεκτική όσο και η συντακτική ανάλυση των προγραμμάτων, και στην οποία εισήχθη ένας ακόμα δείκτης για την βελτίωση της απόδοσης του προγράμματος: είναι ένας νέος δείκτης που υπάρχει μόνο σε τερματικούς κόμβους και δείχνει πάντα στο επόμενο λέκτημα, και αρχικά έχει την ίδια τιμή με τον δείκτη που δείχνει στον επόμενο κόμβο του ρεύματος. Η αλλαγή αυτή έγινε λόγω του ότι οι συναρτήσεις που ήταν υπεύθυνες για την ανανέωση της θέσης και του μήκους των κόμβων κατά τη διάρκεια της λεκτικής ανάλυσης και για την υλοποίηση της όψης του P-Tree καλούνταν χιλιάδες φορές χωρίς λόγο, επισύροντας μεγάλο κόστος στην εκτέλεση. Ένα άλλο πρόβλημα που βρήκαμε όσο μελετούσαμε το Meddle, είναι ότι δε δέχεται σαν αναγνωριστικά (identifiers - ονόματα μεταβλητών, συναρτήσεων κ.λπ.) μονά γράμματα, αλλά συμβολοσειρές από 2 γράμματα και πάνω. Όπως θα δούμε στο επόμενο παράδειγμα, αυτό περιπλέκει τους χειρισμούς της δομής P-Tree στα ανιχνευμένα λεκτήματα. Το Meddle, λοιπόν, όποτε ανιχνεύσει μιαν αλλαγή στο κείμενο χρησιμοποιεί το P-Tree ως ένα δέντρο-ψαξίματος (search tree) για τον πρώτο τερματικό κόμβο που επηρεάζεται. Αυτό επιφέρει διάφορα προβλήματα στην εκτέλεση των αλγορίθμων που περιγράφτηκαν παραπάνω (γι αυτό και απουσιάζει παντελώς η δομή kmn-list), όπως αυτό του επόμενου παραδείγματος: Παράδειγμα 6. Έστω ότι θέλουμε να γράψουμε την εντολή print 42. (η print στην MiniBasic είναι δεσμευμένη λέξη). Γράφουμε ένα-ένα τα γράμματα για να δούμε την συμπεριφορά του Meddle ενώ προσπαθεί αυξητικά να αναγνωρίσει τη δεσμευμένη λέξη print. Με την ολοκλήρωση της λέξης, τα γράμματα παραμένουν χρωματισμένα ως identifiers και η ίδια η λέξη δεν αναγνωρίζεται ως δεσμευμένη, μέχρις ώτου μετακινήσουμε τον cursor στην αρχή της και εισαγάγουμε ένα κενό. Το πρώτο τερματικό σύμβολο που επηρεάζεται από την εισαγωγή του t είναι το n, έτσι ο λεκτικός αναλυτής θα μετακινηθεί προς τα πίσω και θα ξαναδιαβάσει το nt, και όχι ολόκληρη τη λέξη print. Η υπόθεση που γίνεται είναι πως το πολύ ο άμεσως προηγούμενος κάποιου κόμβου μπορεί να επηρεαστεί από την αλλαγή του, αλλά κανένας πριν από αυτόν. Οι Αλγόριθμοι 3 και 4 δίνουν μια λιγάκι διαφορετική ουσία στο θέμα, αφού αναφέρουν ότι ο λεκτικός αναλυτής μπορεί να γυρίσει πίσω είτε ένα χαρακτήρα είτε στην αρχή ολόκληρης της γραμμής για να επανανιχνεύσει λεκτήματα. 52

53 Κεφάλαιο 8 Συναρτησιακή Αυξητική Λεκτική και Συντακτική Ανάλυση 8.1 Οκνηρή Αποτίμηση και Αυξητική Συντακτική Ανάλυση Οκνηρή Αποτίμηση Το κύριο χαρακτηριστικό της γλώσσας προγραμματισμού Haskell είναι ότι προσφέρει οκνηρή αποτίμηση (lazy evaluation) στα προγράμματά της. Με τον όρο οκνηρή αποτίμηση ονομάζουμε την τεχνική κατά την οποία ένας υπολογισμός καθυστερείται μέχρι το αποτέλεσμά του να χρειαστεί για τον υπολογισμό κάποιας άλλης παράστασης. Τα οφέλη της οκνηρής αποτίμησης είναι πολλά: αυξημένη απόδοση του μεταγλωττιστή λόγω αποφυγής αχρείαστων υπολογισμών, αποφυγή υπολογισμού εσφαλμένων συνθηκών στην αποτίμηση σύνθετων εκφράσεων, δυνατότητα κατασκευής άπειρων δομών δεδομένων 1, και η δυνατότητα ορισμού δομών ελέγχου σαν κανονικές συναρτήσεις παρά σαν προκαθορισμένες πρωταρχικές συναρτήσεις. Η Haskell χρησιμοποιεί στρατηγική call-by-need για την υλοποίηση της οκνηρής αποτίμησης (κυρίως για λόγους απόδοσης). Η οκνηρή αποτίμηση αναφέρεται στο πώς οι εκφράσεις αποτιμώνται όταν περνώνται σαν ορίσματα σε συναρτήσεις, και περιλαμβάνει τα εξής 3 σημεία: 1. Η έκφαση αποτιμάται μόνο εάν το αποτέλεσμά της χρειάζεται να περαστεί στην καλούσα συνάρτηση (καθυστερημένη αποτίμηση - delayed evaluation) 2. Η έκφραση αποτιμάται μόνο στην έκταση που χρειάζεται από την καλούσα συνάρτηση (βραχυκυκλωμένη αποτίμηση - short-circuit evaluation) 3. Η έκφραση δεν αποτιμάται ποτέ περισσότερες από μία φορά (αποτίμηση εφαρμοζόμενης σειράς - applicative-order evaluation) Ως παράδειγμα για τη χρήση της οκνηρής αποτίμησης στην καθημερινή ζωή, θα δούμε το παρακάτω για τον υπολογισμό του n-ού αριθμού Fibonacci: Παράδειγμα 7 Στον παρακάτω κώδικα, για να παραγάγουμε ένα άπειρο ρεύμα από αριθμούς fibonacci και να επιστρέψουμε τον n-ό, χρησιμοποιούμε μερικές από τις συναρτήσεις της Haskell που υπάρχουν στο Prelude (zipwith, tail) και την οκνηρή αποτίμηση, παράγοντας μόνο τους αριθμούς μέχρι εκεί που τους θέλουμε. 1 f i b s = 0 : 1 : z i p W i t h (+) f i b s ( t a i l f i b s ) Η Οκνηρή Αποτίμηση ως Μέσο για Επίτευξη Αυξητικής Συντακτικής Ανάλυσης Οι online συντακτικοί αναλυτές (γνωστοί επίσης και σαν polish συντακτικοί αναλυτές) παρουσιάζουν οκνηρή συμπεριφορά, αφού ποτέ δεν προχωρούν περισσότερο από εκεί που χρειάζεται ώστε να επιστρέψουν τους αναγκαίους κόμβους για σχηματισμό του AST. Υποθέτοντας επίσης ότι μετά τη χρήση 1 Οι πιο δημοφιλείς άπειρες δομές δεδομένων είναι οι άπειρες λίστες στην Haskell 53

54 του online συντακτικού αναλυτή χρησιμοποιούμε προθεματική (pre-order) διάσχιση για να δούμε τα περιεχόμενά του, η κατάσταση του αρχείου και του συντακτικού δέντρου φαίνεται στην εικόνα Σχήμα 8.1: Κοιτάζοντας την αρχή ενός αρχείου. Το μεγάλο τρίγωνο αντιπροσωπεύει το συντακτικό δέντρο που αντιστοιχεί σε ολόκληρο το αρχείο, και το μικρό, χρωματισμένο στο επιμέρους συντακτικό δέντρο που αντιστοιχεί στο τμήμα του κειμένου που ο χρήστης βλέπει μόλις ανοίξει το αρχείο. Η ευθεία γραμμή στο κάτω μέρος συμβολίζει το αρχείο, η τεθλασμένη το μέρος του αρχείου το οποίο έχει υποστεί συντακτική ανάλυση, και το χρωματισμένο ορθογώνιο το οπτικό παράθυρο (το τμήμα που ο χρήστης βλέπει). Το οπτικό παράθυρο έχει θέση στην αρχή του αρχείου. Για να δει ο χρήστης τα περιεχόμενα του δέντρου, αρκεί μια προθεματική διάσχισή του. Η διάσχιση αυτή επιβάλλει συντακτική ανάλυση στο αντίστοιχο κομμάτι κειμένου, αλλά χάρη στην οκνηρή αποτίμηση μόνο μέχρι το τέλος του συν όσα look-ahead σύμβολα χρειάζεται ο συντακτικός μας αναλυτής σε κάθε περίπτωση και όχι παρακάτω. Εάν ο χρήστης μεταβάλει την είσοδο στο σημείο αυτό, φέρνει το σχηματισμένο συντακτικό δέντρο σε κατάσταση που δεν ανταποκρίνεται στο νέο κείμενο, αλλά είναι τόσο δαπανηρή η ακύρωση και ο επανασχηματισμός του, έτσι οι μέθοδοι που θα περιγραφούν παρακάτω εγγυούνται ότι με συντακτική ανάλυση μόνο αυτών που ο χρήστης βλέπει στην οθόνη του θα έχουμε το σωστό συντακτικό δέντρο. Όσο ο χρήστης προχωρά προς το τέλος του αρχείου για να δει τα περιεχόμενά του, όλο και περισσότερο από το AST χρειάζεται να σχηματιστεί, έτσι η συντακτική ανάλυση προχωρά σε βήματα, όπως φαίνεται στην παρακάτω εικόνα. Στο σημείο αυτό, εάν τυχόν ο χρήστης μεταβάλει τα περιεχόμενα του αρχείου θα κόστιζε ακόμα περισσότερο η διαδικασία επανασχηματισμού του από την αρχή του αρχείου, ειδικά αν αυτό είναι πολύ μεγάλο. Έτσι, ο επεξεργαστής κειμένου Yi αποθηκεύει την κατάσταση του συντακτικού αναλυτή στην οποία ο χρήστης έκανε την τροποποίηση, και συνεχίζει την συντακτική ανάλυση από εκείνο το σημείο, βασιζόμενος στο προϋπάρχον συντακτικό δέντρο. Επεκτείνοντας τη σκέψη αυτή, αν αποθηκεύονται τα επιμέρους αποτελέσματα της συντακτικής ανάλυσης ανά μέρος του κειμένου που ο χρήστης βλέπει στην οθόνη του, μπορούμε να εγγυηθούμε ότι ποτέ δε θα χρειαστεί ανάλυση περισσότερου κειμένου από αυτό που χωράει στην οθόνη κάθε φορά. Με τον τρόπο αυτό επιτυγχάνεται αυξητική συντακτική ανάλυση, με την έννοια ότι το μέγεθος της δουλειάς που πρέπει ο συντακτικός αναλυτής να επιτελέσει μετά από κάθε επέμβαση του χρήστη στο κείμενο εξαρτάται μόνο από το μέγεθος της αλλαγής ή το μέγεθος της κίνησης (δηλαδή γενικά από το πόσο μεγάλο είναι το νέο κείμενο που εισέρχεται στην 2 Οι εικόνες 9 και 10 πάρθηκαν απ ευθείας από το [Bern09], αφού από όσες πηγές αναφέρονται στις εν λόγω εικόνες περιγράφεται καλύτερα η συγκεκριμένη κατάσταση. 54

55 Σχήμα 8.2: Κοιτάζοντας το μέσο ενός αρχείου. Η συντακτική ανάλυση προχωράει με γραμμικό τρόπο: παρόλο που μόνο ένα μικρό κομμάτι του συντακτικού δέντρου απαιτείται να υπάρχει, εντούτοις η κατασκευή του θα εξαρτάται όχι μόνο από το τμήμα του κειμένου στο οποίο αναφέρεται, αλλά και σε ό,τι άλλο προηγείται. οθόνη) Στόχοι Οι στόχοι του [Bern09] κατά τους συγγραφείς του είναι οι εξής: Περιγραφή μιας νέας, αμιγώς συναρτησιακής προσέγγισης στο θέμα της αυξητικής συντακτικής ανάλυσης, η οποία κάνει χρήση της οκνηρής αποτίμισης Ολοκλήρωση της προσέγγισης με μεθόδους διόρθωσης λαθών (error correcting codes), αφού ένας online συντακτικός αναλυτής θα πρέπει να είναι καθολικός, δηλαδή να επιτυγχάνει για κάθε είσοδο Η υλοποίηση αυτών των μεθόδων έχει γίνει μόλις τον Νοέμβριο του 2008, και βρίσκουν εφαρμογή στον επεξεργαστή κειμένου Yi όπως θα περιγράψουμε παρακάτω Διαπροσωπεία και Προοπτική Το σημαντικότερο μέρος της δουλειάς αυτής, είναι η δημιουργία μιας βιβλιοθήκης συνδυαστών (combinators) με μια σταθερή διαπροσωπεία για τη χρήση της, όπως αυτήν που πρωτοπαρουσιάστηκε το 2000 στο [Swie]. Τέτοιες διαπροσωπείες μπορούν να κατασκευαστούν με χρήση Γενικευμένων Αλγεβραϊκών Τύπων Δεδομένων (ΓΑΤΔ - Generalized Albebraic Data Types - GADT). Οι συνδυαστές αυτοί δίνονται παραδοσιακά σαν συναρτήσεις αντί σαν κατασκευαστές (constructors) όμως λόγω της αυξημένης χρησιμότητάς τους στο [Bern09] θα προτιμούμε το παρακάτω στυλ για συνέπεια: 1 data P a r s e r s a where 2 Pure : : a > P a r s e r s a 3 ( : : ) : : P a r s e r s ( b > a ) > P a r s e r s b > P a r s e r s a 4 Symb : : P a r s e r s a > ( s > P a r s e r s a ) > P a r s e r s a 5 D i s j : : P a r s e r s a > P a r s e r s a > P a r s e r s a 6 F a i l : : P a r s e r s a 55

Εθνικό Μετσόβιο Πολυτεχνείο. Αυξητική Λεκτική και Συντακτική Ανάλυση

Εθνικό Μετσόβιο Πολυτεχνείο. Αυξητική Λεκτική και Συντακτική Ανάλυση Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών Αυξητική Λεκτική και Συντακτική Ανάλυση ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ΣΠΥΡΟΣ ΧΑΤΖΗΧΡΙΣΤΟΔΟΥΛΟΥ

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Κεφάλαιο 2: Τυπικές γλώσσες Κεφάλαιο 2: Τυπικές γλώσσες (μέρος 2ο) Νίκος Παπασπύρου, Κωστής Σαγώνας Μεταγλωττιστές Μάρτιος 2017 47 / 216 Γλώσσες χωρίς συμφραζόμενα (i) Γραμματικές χωρίς συμφραζόμενα: Σε κάθε παραγωγή ένα μη τερματικό

Διαβάστε περισσότερα

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Λογισμικό Συστήματος. Κλειώ Σγουροπούλου Λογισμικό Συστήματος Κλειώ Σγουροπούλου Λογισμικό συστήματος Λειτουργικό σύστημα Μεταφραστές γλώσσας (translators) Διερμηνείς (interpreters) Μεταγλωττιστές (compilers) Εκδότες (editors) Φορτωτές (loaders)

Διαβάστε περισσότερα

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

Έστω συμβολοσειρά Το σύνολο FIRST περιέχει τα τερματικά σύμβολα από τα οποία αρχίζουν οι συμβολοσειρές που παράγονται από την Βοηθητικές έννοιες (i) Σύνολα FIRST Έστω συμβολοσειρά Το σύνολο FIRST περιέχει τα τερματικά σύμβολα από τα οποία αρχίζουν οι συμβολοσειρές που παράγονται από την Αν a τότε a FIRST Αν τότε FIRST Νίκος Παπασπύρου,

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Μεταφραστές Εισαγωγή Διδάσκων: Επικ. Καθ. Γεώργιος Μανής Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό

Διαβάστε περισσότερα

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

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής Εισαγωγή Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής Μεταγλωττιστής Αρχικό πρόγραμμα (source program) Μεταγλωττιστής Τελικό πρόγραμμα (object program) Διαγνωστικά μηνύματα Μεταγλωττιστής Παίρνει σαν

Διαβάστε περισσότερα

Κεφάλαιο 2: Τυπικές γλώσσες. Νίκος Παπασπύρου, Κωστής Σαγώνας Μεταγλωττιστές Μάρτιος / 216

Κεφάλαιο 2: Τυπικές γλώσσες. Νίκος Παπασπύρου, Κωστής Σαγώνας Μεταγλωττιστές Μάρτιος / 216 Κεφάλαιο 2: Τυπικές γλώσσες Νίκος Παπασπύρου, Κωστής Σαγώνας Μεταγλωττιστές Μάρτιος 2017 13 / 216 Τυπικές γλώσσες (i) Βασικές έννοιες Αλφάβητο Σύμβολο Συμβολοσειρά Μήκος συμβολοσειράς Σύνολο συμβολοσειρών

Διαβάστε περισσότερα

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

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος Κεφάλαιο 2.3: Προγραμματισμός 1 2.3.1 Αναφορά σε γλώσσες προγραμματισμού και «Προγραμματιστικά Υποδείγματα» 2.3.1.1 Πρόγραμμα και Γλώσσες Προγραμματισμού Πρόγραμμα: σύνολο εντολών που χρειάζεται να δοθούν

Διαβάστε περισσότερα

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

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο Εισαγωγή στο Bison Μεταγλωττιστές, Χειμερινό εξάμηνο 2016-2017 Συντακτική Ανάλυση Αποτελεί την δεύτερη φάση της μετάφρασης. Εύρεση της σχέσης που υπάρχει των λεκτικών μονάδων ενός προγράμματος. Παράδειγμα

Διαβάστε περισσότερα

Πληροφορική 2. Γλώσσες Προγραμματισμού

Πληροφορική 2. Γλώσσες Προγραμματισμού Πληροφορική 2 Γλώσσες Προγραμματισμού 1 2 Γλώσσες προγραμματσιμού Επιτρέπουν την κωδικοποίηση των αλγορίθμων Η εκτέλεση ενός προγράμματος θα πρέπει να δίνει τα ίδια αποτελέσματα με την νοητική εκτέλεση

Διαβάστε περισσότερα

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

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού ( Απαντήσεις & Λύσεις Βιβλίου) 1. Σκοποί κεφαλαίου Κύκλος ανάπτυξης προγράµµατος Κατηγορίες γλωσσών προγραµµατισµού

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής Δεύτερη Σειρά Ασκήσεων 22 Νοεμβρίου 2016 (χειρόγραφη και ηλεκτρονική παράδοση 9 Δεκεμβρίου) Άσκηση 1: Θεωρήστε τη γραμματική με κανόνες: Α B a A a c B B b A b

Διαβάστε περισσότερα

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

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση 2011-2012 Γιάννης Γαροφαλάκης, Καθηγητής Αθανάσιος Ν.Νικολακόπουλος, Υποψήφιος Διδάκτορας 28 Μαρτίου 2012 Περίληψη Σκοπός της παρούσας

Διαβάστε περισσότερα

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

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο Εισαγωγή στο Bison Μεταγλωττιστές, Χειμερινό εξάμηνο 2014-2015 Συντακτική Ανάλυση Αποτελεί την δεύτερη φάση της μετάφρασης. Εύρεση της σχέσης που υπάρχει των λεκτικών μονάδων ενός προγράμματος. Παράδειγμα

Διαβάστε περισσότερα

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

Εισαγωγή στην επιστήμη των υπολογιστών Εισαγωγή στην επιστήμη των υπολογιστών Λογισμικό Υπολογιστών Γλώσσες Προγραμματισμού 1 Εξέλιξη Οι γλώσσες προγραμματισμού είναι σύνολα από προκαθορισμένες λέξεις οι οποίες συνδυάζονται σε προγράμματα σύμφωνα

Διαβάστε περισσότερα

Μαλούτα Θεανώ Σελίδα 1

Μαλούτα Θεανώ Σελίδα 1 ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΡΧΕΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Α. ΕΡΩΤΗΣΕΙΣ ΘΕΩΡΙΑΣ ΦΥΛΛΑΔΙΟ 6 ο ( Ενότητες 2.3 ) 1.Τι είναι πρόγραμμα; 2. Ποια είναι τα πλεονεκτήματα των γλωσσών υψηλού επιπέδου σε σχέση με τις γλώσσες

Διαβάστε περισσότερα

Τεχνολογία Λογισµικού Ι Κεφάλαιο 5

Τεχνολογία Λογισµικού Ι Κεφάλαιο 5 ΕΛΛΗΝΙΚΟ ΑΝΟΙΧΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Πρόγραµµα σπουδών "ΠΛΗΡΟΦΟΡΙΚΗ" - Θ.Ε. ΠΛΗ11 Τεχνολογία Λογισµικού Ι Κεφάλαιο 5 Βασίλειος Βεσκούκης ιδάκτωρ Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών v.vescoukis@cs.ntua.gr

Διαβάστε περισσότερα

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

Θέματα Μεταγλωττιστών Γιώργος Δημητρίου Ενότητα 1 η : Parsers Συντακτική Ανάλυση για ΓΧΣ Οι τεχνικές συντακτικής ανάλυσης κατηγοριοποιούνται με βάση διάφορα κριτήρια: Κατεύθυνση ανάλυσης μη τερματικών συμβόλων Σειρά επιλογής

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Περιεχόµενα. Ανασκόπηση - Ορισµοί. Ο κύκλος ανάπτυξης προγράµµατος. Γλώσσες Προγραµµατισµού Ασκήσεις

Περιεχόµενα. Ανασκόπηση - Ορισµοί. Ο κύκλος ανάπτυξης προγράµµατος. Γλώσσες Προγραµµατισµού Ασκήσεις Προγραµµατισµός Η/Υ Ανασκόπηση - Ορισµοί Περιεχόµενα Ο κύκλος ανάπτυξης προγράµµατος Περιγραφή προβλήµατος Ανάλυση προβλήµατος Λογικό ιάγραµµα Ψευδοκώδικας Κωδικοποίηση Συντήρηση Γλώσσες Προγραµµατισµού

Διαβάστε περισσότερα

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος. 1. Δώστε τον ορισμό του προβλήματος. 2. Σι εννοούμε με τον όρο επίλυση ενός προβλήματος; 3. Σο πρόβλημα του 2000. 4. Σι εννοούμε με τον όρο κατανόηση προβλήματος; 5. Σι ονομάζουμε χώρο προβλήματος; 6.

Διαβάστε περισσότερα

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

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 3 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής Γιώργος Δημητρίου Μάθημα 3 ο Λεκτική Ανάλυση και Λεκτικοί Αναλυτές Γενικά για τη λεκτική ανάλυση Έννοιες που χρειαζόμαστε Τεχνικές λεκτικής ανάλυσης Πίνακας συμβόλων και διαχείριση λαθών Σχεδίαση λεκτικού

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Α. Ερωτήσεις Ανάπτυξης οµηµένος Προγραµµατισµός-Κεφάλαιο 7 Σελίδα 1 α ό 10 ΕΝΟΤΗΤΑ ΙΙΙ (ΠΡΟΓΡΑΜΜΑΤΑ) ΚΕΦΑΛΑΙΟ 7: Είδη, Τεχνικές και Περιβάλλοντα Προγραµµατισµού Α. Ερωτήσεις Ανάπτυξης 1. Τι ονοµάζουµε γλώσσα προγραµµατισµού;

Διαβάστε περισσότερα

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

Προβλήματα, αλγόριθμοι, ψευδοκώδικας Προβλήματα, αλγόριθμοι, ψευδοκώδικας October 11, 2011 Στο μάθημα Αλγοριθμική και Δομές Δεδομένων θα ασχοληθούμε με ένα μέρος της διαδικασίας επίλυσης υπολογιστικών προβλημάτων. Συγκεκριμένα θα δούμε τι

Διαβάστε περισσότερα

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον κεφ.6 Εισαγωγή στον Προγραμματισμό Μάριος Αραποστάθης Καθηγητής πληροφορικής Βαρβάκειου Λύκειου http://users.sch.gr/mariosarapostathis 6.1 Η έννοια του

Διαβάστε περισσότερα

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

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ Ενότητα 6: Λογισμικό Υπολογιστών Γλώσσες Προγραμματισμού Πασχαλίδης Δημοσθένης Τμήμα Διαχείρισης Εκκλησιαστικών Κειμηλίων Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07 Αλγόριθμος: Βήμα προς βήμα διαδικασία για την επίλυση κάποιου προβλήματος. Το πλήθος των βημάτων πρέπει να είναι πεπερασμένο. Αλλιώς: Πεπερασμένη

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. 03/01/09 Χαράλαμπος Τζόκας 1

ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. 03/01/09 Χαράλαμπος Τζόκας 1 ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ 03/01/09 Χαράλαμπος Τζόκας 1 Πρόγραμμα - Προγραμματισμός Πρόγραμμα: Σύνολο εντολών που πρέπει να δοθούν στον Υπολογιστή, ώστε να υλοποιηθεί ο αλγόριθμος της επίλυσης

Διαβάστε περισσότερα

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

Θέματα Μεταγλωττιστών Θέματα Μεταγλωττιστών Γιώργος Δημητρίου Ενότητα 1 η : Parsers Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών Συντακτική Ανάλυση για ΓΧΣ Οι τεχνικές συντακτικής ανάλυσης κατηγοριοποιούνται

Διαβάστε περισσότερα

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19 Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών Κεφ. 2 Θεωρητική Επιστήμη Υπολογιστών 2.3.1.1 Έννοια προγράμματος Τι είναι πρόγραμμα και τι προγραμματισμός; Πρόγραμμα είναι το σύνολο εντολών που χρειάζεται

Διαβάστε περισσότερα

Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ

Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ Εισαγωγή στις Αρχές της Επιστήμης των ΗΥ 2.3.1.1. Παπαγιάννη Νάσια Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών ΕΜΠ 1 περιλαμβάνει: Η έννοια του προγράμματος Επίλυση προβλήματος 1. Ακριβή προσδιορισμό

Διαβάστε περισσότερα

Outline. 4 Object-Oriented Programming

Outline. 4 Object-Oriented Programming Προγραμματισμός Ηλεκτρονικών Υπολογιστών Φιλοσοφίες γλωσσών προγραμματισμού Διδάσκων: Στάθης Ζάχος Επιμέλεια Διαφανειών: Μάκης Αρσένης CoReLab ΣΗΜΜΥ - Ε.Μ.Π. Ιανουάριος 2016 ιδάσκων: Στάθης Ζάχος ( CoReLab

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Αλγόριθμοι και Προγράμματα

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού Εισαγωγή στην επιστήμη των υπολογιστών Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού 1 Εξέλιξη Οι γλώσσες προγραμματισμού είναι σύνολα από προκαθορισμένες λέξεις οι οποίες συνδυάζονται σε προγράμματα

Διαβάστε περισσότερα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΙΜΕΛΕΙΑ: ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ 6 ΟΥ ΚΕΦΑΛΑΙΟΥ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ 6.1 Τι ονοµάζουµε πρόγραµµα υπολογιστή; Ένα πρόγραµµα

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΚΕΦΑΛΑΙΟ 6 - ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Προγραµµατισµός Η/Υ Ο προγραµµατισµός είναι η διατύπωση του αλγορίθµου σε µορφή κατανοητή από τον Η/Υ ώστε να τον εκτελέσει («τρέξει» όπως λέµε στην ορολογία της

Διαβάστε περισσότερα

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

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C Στο εργαστήριο αυτό, θα ασχοληθούμε με δύο προγραμματιστικά περιβάλλοντα για τη γλώσσα C: τον gcc μεταγλωττιστή της C σε περιβάλλον

Διαβάστε περισσότερα

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

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ Κεφάλαιο 7 ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ Ερωτήσεις 1. Να αναφέρετε διαφορές μεταξύ γλωσσών μηχανής και γλωσσών χαμηλού επιπέδου. Οι γλώσσες μηχανής κωδικοποιούν τις εντολές τους με ομάδες

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 4 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής Γιώργος Δημητρίου Μάθημα 4 ο Συντακτική Ανάλυση Επαλήθευση της σύνταξης του προγράμματος Κατασκευή συντακτικού δέντρου Η κεντρική φάση της Μετάφρασης Οδηγούμενης από τη Σύνταξη Από εδώ ξεκινά η παραγωγή

Διαβάστε περισσότερα

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

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών Ενότητα 2: Mεταφραστές Καθ. Γιάννης Γαροφαλάκης Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ και Πληροφορικής Λειτουργία Μετάφρασης ΑΡΧΙΚΗ ΓΛΩΣΣΑ (Source) L A ΓΛΩΣΣΑ

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΙΜΕΛΕΙΑ: ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΣΚΗΣΕΙΣ 6 ΟΥ ΚΕΦΑΛΑΙΟΥ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΕΡΩΤΗΣΕΙΣ ΣΩΣΤΟ ΛΑΘΟΣ Σημειώστε αν είναι σωστή ή

Διαβάστε περισσότερα

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

Απάντηση: (func endfunc)-([a-za-z])+ Γλώσσες Προγραμματισμού Μεταγλωττιστές Ασκήσεις Επανάληψης ) Περιγράψτε τις κανονικές εκφράσεις που υποστηρίζουν (i) συμβολοσειρές που ξεκινούν με το πρόθεμα "func" ή "endfunc" ακολουθούμενο το σύμβολο

Διαβάστε περισσότερα

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

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C Στο εργαστήριο αυτό, θα ασχοληθούμε με δύο προγραμματιστικά περιβάλλοντα της γλώσσας C, το Dev-C++, το οποίο είναι εφαρμογή που τρέχει

Διαβάστε περισσότερα

Κεφάλαιο 2: Μεταφραστές

Κεφάλαιο 2: Μεταφραστές Κεφάλαιο 2: Μεταφραστές Αρχές Γλωσσών και Προγραμματισμού Λειτουργία Μετάφρασης ΑΡΧΙΚΗ ΓΛΩΣΣΑ (Source) L A ΓΛΩΣΣΑ ΥΛΟΠΟΙΗΣΗΣ ΜΕΤΑΦΡΑΣΤΗ (Implementation) L Y ΤΕΛΙΚΗ ΓΛΩΣΣΑ (Target) L T Αρχικό Πρόγραμμα

Διαβάστε περισσότερα

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ Καθηγητής Πληροφορικής ΠΕ19 1 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΚΕΦΑΛΑΙΟ 6 ο : ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΙΣΤΟΣΕΛΙΔΑ ΜΑΘΗΜΑΤΟΣ: http://eclass.sch.gr/courses/el594100/ Η έννοια του προγράμματος

Διαβάστε περισσότερα

Π ρ ο γ ρ α μ μ α τ ι σ μ ό ς Β α σ ι κ έ ς έ ν ν ο ι ε ς Ι σ τ ο ρ ι κ ή α ν α δ ρ ο μ ή Η έννοια του προγράμματος Ιστορική αναδρομή

Π ρ ο γ ρ α μ μ α τ ι σ μ ό ς Β α σ ι κ έ ς έ ν ν ο ι ε ς Ι σ τ ο ρ ι κ ή α ν α δ ρ ο μ ή Η έννοια του προγράμματος Ιστορική αναδρομή Προγραμματισμός Βασικές έννοιες Ιστορική αναδρομή Η έννοια του προγράμματος Η περιγραφή της λύσης ενός προβλήματος, ως γνωστόν, γίνεται με τη βοήθεια ενός αλγορίθμου. Έτσι οι εντολές ενός προγράμματος

Διαβάστε περισσότερα

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

Επιµέλεια Θοδωρής Πιερράτος Εισαγωγή στον προγραµµατισµό Η έννοια του προγράµµατος Ο προγραµµατισµός ασχολείται µε τη δηµιουργία του προγράµµατος, δηλαδή του συνόλου εντολών που πρέπει να δοθούν στον υπολογιστή ώστε να υλοποιηθεί

Διαβάστε περισσότερα

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

Αυτόματα. Παράδειγμα: πωλητής καφέ (iii) Παράδειγμα: πωλητής καφέ (iv) Εισαγωγή στην Επιστήμη των Υπολογιστών. Προδιαγραφές Εισαγωγή στην Επιστήμη των Υπολογιστών 4ο εξάμηνοσ.h.m.μ.y. & Σ.Ε.Μ.Φ.Ε. http://www.corelab.ece.ntua.gr/courses/ 3η ενότητα: Αυτόματα και Τυπικές Γραμματικές Στάθης Ζάχος Συνεργασία: Κωστής Σαγώνας Επιμέλεια:

Διαβάστε περισσότερα

Η ΑΕΠΠ IN A GLANCE! ΦΡΟΝΤΙΣΤΗΡΙΑ ΠΟΛΥΜΕΝΗ

Η ΑΕΠΠ IN A GLANCE! ΦΡΟΝΤΙΣΤΗΡΙΑ ΠΟΛΥΜΕΝΗ Η ΑΕΠΠ IN A GLANCE! Κατανομή μονάδων: 40 μονάδες το 1 ο Θέμα, από 20 τα υπόλοιπα τρία. Μην χαίρεστε όμως γιατί η «καθαρή» θεωρία περιορίζεται συνήθως- σε 5 ερωτήσεις σωστού ή λάθους και σε 1-2 ερωτήσεις

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Μεταγλωττιστές Ενότητα 1: Εισαγωγή Μεταγλωττιστές Ενότητα 1: Εισαγωγή Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες,

Διαβάστε περισσότερα

ΜΑΘΗΜΑ: Μεταγλωττιστές

ΜΑΘΗΜΑ: Μεταγλωττιστές Comment [h1]: Παράδειγμ α: https://ocp.teiath.gr/modules/ exercise/exercise_result.php?course=pey101&eurid=16 9 ΜΑΘΗΜΑ: Μεταγλωττιστές ΔΙΔΑΣΚΩΝ: Άγγελος Μιχάλας ΤΜΗΜΑ: Τμήμα Μηχανικών Πληροφορικής ΤΕ 1

Διαβάστε περισσότερα

Αρχές Προγραμματισμού Υπολογιστών

Αρχές Προγραμματισμού Υπολογιστών Αρχές Προγραμματισμού Υπολογιστών Ανάπτυξη Προγράμματος Β ΕΠΑΛ Τομέας Πληροφορικής Βελώνης Γεώργιος Καθηγητής Πληροφορικής ΠΕ20 Κύκλος ανάπτυξης προγράμματος/λογισμικού Η διαδικασία ανάπτυξης λογισμικού,

Διαβάστε περισσότερα

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Δεύτερη Σειρά Ασκήσεων 22 Νοεμβρίου 2016 Μέρος Α. (χειρόγραφη και ηλεκτρονική παράδοση 9 Δεκεμβρίου) Άσκηση 1: Θεωρήστε τη

Διαβάστε περισσότερα

Πληροφορική 2. Αλγόριθμοι

Πληροφορική 2. Αλγόριθμοι Πληροφορική 2 Αλγόριθμοι 1 2 Τι είναι αλγόριθμος; Αλγόριθμος είναι ένα διατεταγμένο σύνολο από σαφή βήματα το οποίο παράγει κάποιο αποτέλεσμα και τερματίζεται σε πεπερασμένο χρόνο. Ο αλγόριθμος δέχεται

Διαβάστε περισσότερα

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

Η γλώσσα προγραμματισμού Strange Προγραμματιστική άσκηση: Η γλώσσα προγραμματισμού Strange Η Strange είναι μια μικρή γλώσσα προγραμματισμού. Παρόλο που οι προγραμματιστικές της ικανότητες είναι μικρές, η εκπαιδευτική αυτή γλώσσα περιέχει

Διαβάστε περισσότερα

Μηχανές Turing (T.M) I

Μηχανές Turing (T.M) I Μηχανές Turing (T.M) I Οι βασικές λειτουργίες μιας TM είναι: Διάβασε το περιεχόμενο του τρέχοντος κυττάρου Γράψε 1 ή 0 στο τρέχον κύτταρο Κάνε τρέχον το αμέσως αριστερότερο ή το αμέσως δεξιότερο κύτταρο

Διαβάστε περισσότερα

Κεφάλαιο 3 Η Σημασιολογία των Γλωσσών Προγραμματισμού

Κεφάλαιο 3 Η Σημασιολογία των Γλωσσών Προγραμματισμού Κεφάλαιο 3 Η Σημασιολογία των Γλωσσών Προγραμματισμού Προπτυχιακό μάθημα Αρχές Γλωσσών Προγραμματισμού Π. Ροντογιάννης 1 Εισαγωγή Γνώση γλώσσας από τη σκοπιά Του συντακτικού (syntax) Περιγραφή με γραμματικές

Διαβάστε περισσότερα

ΕΡΩΤΗΣΕΙΣ ΑΞΙΟΛΟΓΗΣΗΣ

ΕΡΩΤΗΣΕΙΣ ΑΞΙΟΛΟΓΗΣΗΣ Α) Να γράψετε στο τετράδιό σας τον αριθμό κάθε πρότασης και δίπλα το γράμμα "Σ", αν είναι σωστή, ή το γράμμα "Λ", αν είναι λανθασμένη. (Μονάδες 25) 1. Ένα αδόμητο πρόβλημα είναι ταυτόχρονα και ανοικτό

Διαβάστε περισσότερα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. Στέφανος Ουγιάρογλου

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. Στέφανος Ουγιάρογλου ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ Κεφάλαιο 6 «Εισαγωγή στον Προγραμματισμό» Στέφανος Ουγιάρογλου Διαφάνειες από υλικό του Χ. Μουρατίδη Προγραμματισμός Η/Υ Ο προγραμματισμός είναι η διατύπωση

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Mεταγλωττιστές. 4 ο εργαστηριακό μάθημα Λεξική ανάλυση και flex. Θεωρία Mεταγλωττιστές 4 ο εργαστηριακό μάθημα Λεξική ανάλυση και flex Σκοπός: Το μάθημα αυτό αναφέρεται: στις κανονικές εκφράσεις στην δομή και το περιεχόμενο του αρχείου-εισόδου του flex Γενικά Θεωρία Κατά την

Διαβάστε περισσότερα

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

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση 2012-2013 Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση 2012-2013 27 Μαρτίου 2013 Περίληψη Σκοπός της παρούσας εργασίας είναι η εξοικείωσή σας με τις θεμελιώδεις θεωρητικές και πρακτικές πτυχές

Διαβάστε περισσότερα

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Οργάνωση Προγράµµατος Header Files Μετάφραση και σύνδεση αρχείων προγράµµατος ΕΠΛ 132 Αρχές Προγραµµατισµού

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών 44 Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών Διδακτικοί στόχοι Σκοπός του κεφαλαίου είναι οι μαθητές να κατανοήσουν τα βήματα που ακολουθούνται κατά την ανάπτυξη μιας εφαρμογής.

Διαβάστε περισσότερα

ΑΕΠΠ Ερωτήσεις θεωρίας

ΑΕΠΠ Ερωτήσεις θεωρίας ΑΕΠΠ Ερωτήσεις θεωρίας Κεφάλαιο 1 1. Τα δεδομένα μπορούν να παρέχουν πληροφορίες όταν υποβάλλονται σε 2. Το πρόβλημα μεγιστοποίησης των κερδών μιας επιχείρησης είναι πρόβλημα 3. Για την επίλυση ενός προβλήματος

Διαβάστε περισσότερα

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

Εισαγωγή στον προγραμματισμό Ενότητες: Εισαγωγή στον προγραμματισμό Η έννοια του προγράμματος Ιστορική αναδρομή Φυσικές και τεχνητές γλώσσες Τεχνικές σχεδίασης προγραμμάτων Ιεραρχική Σχεδίαση Τμηματικός Προγραμματισμός Δομημένος προγραμματισμός

Διαβάστε περισσότερα

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

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή Αντίρριο, 05/04/2017 Προδιαγραφές Εργαστηριακής Εργασίας για το μάθημα «Μεταγλωττιστές» To δεύτερο μέρος της εργασίας έχει ως στόχο την ανάπτυξη του συντακτικού αναλυτή με χρήση του bison / byacc. Στο

Διαβάστε περισσότερα

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

Αυτόματα. Παράδειγμα: πωλητής καφέ (iii) Παράδειγμα: πωλητής καφέ (iv) Εισαγωγή στην Επιστήμη των Υπολογιστών 6 Εισαγωγή στην Επιστήμη των Υπολογιστών 3η ενότητα: Αυτόματα και Τυπικές Γραμματικές http://www.corelab.ece.ntua.gr/courses/ Αυτόματα Τρόπος κωδικοποίησης αλγορίθμων. Τρόπος περιγραφής συστημάτων πεπερασμένων

Διαβάστε περισσότερα

Υλοποίηση ΣΑ με το bison

Υλοποίηση ΣΑ με το bison (i) Μεταεργαλείο bison: γεννήτορας ΣΑ LALR(1) Είσοδος: μεταπρόγραμμα που περιγράφει τη σύνταξη και τις σημασιολογικές ρουτίνες Έξοδος: πρόγραμμα σε C Η συνάρτηση yyparse υλοποιεί το ΣΑ Επιστρέφει 0 αν

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

Μ Ε Ρ Ο Σ Γ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Μ Ε Ρ Ο Σ Γ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ 6.1 Γλώσσες Προγραμματισμού 6.1.1 Γλώσσες μηχανής (1 η γενιά) Η γλώσσα στην οποία ένας ηλεκτρονικός υπολογιστής καταλαβαίνει

Διαβάστε περισσότερα

6. 1 Η έννοια του προγράμματος

6. 1 Η έννοια του προγράμματος 6. 1 Η έννοια του προγράμματος Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει, τρία στάδια. 1.Τον ακριβή προσδιορισμό του προβλήματος. 2.Την ανάπτυξη του αντίστοιχου αλγορίθμου. 3.Τη διατύπωση

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει τρία εξίσου σημαντικά στάδια.

ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει τρία εξίσου σημαντικά στάδια. ΚΕΦΑΛΑΙΟ 6 ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει τρία εξίσου σημαντικά στάδια. Τον ακριβή προσδιορισμό του προβλήματος. Την ανάπτυξη του αντίστοιχου αλγορίθμου.

Διαβάστε περισσότερα

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ 5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ 5.1 Εισαγωγή στους αλγορίθμους 5.1.1 Εισαγωγή και ορισμοί Αλγόριθμος (algorithm) είναι ένα πεπερασμένο σύνολο εντολών οι οποίες εκτελούν κάποιο ιδιαίτερο έργο. Κάθε αλγόριθμος

Διαβάστε περισσότερα

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

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Εισαγωγή στη C Λίγα λόγια για την C Γλώσσα προγραμματισμού υψηλού επιπέδου. Σχεδιάστηκε και υλοποιήθηκε από τον Dennis Richie στις αρχές της δεκαετίας του 1970 (Bell Labs). Η

Διαβάστε περισσότερα

ΜΕΡΙΚΑ ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΙΣ ΓΛΩΣΣEΣ ΠPOΓPAMMATIΣMOY

ΜΕΡΙΚΑ ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΙΣ ΓΛΩΣΣEΣ ΠPOΓPAMMATIΣMOY ΜΕΡΙΚΑ ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΙΣ ΓΛΩΣΣEΣ ΠPOΓPAMMATIΣMOY Mία γλώσσα προγραμματισμού συνίσταται από ένα περιορισμένο υποσύνολο της αγγλικής γλώσσας και το οποίο αποτελείται από εκφράσεις σαφώς ορισμένες, χωρίς παρερμηνεία.

Διαβάστε περισσότερα

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

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης Εργαστήριο 6 Εντολές Επανάληψης Η δομή Επιλογής στη PASCAL H δομή Επανάληψης στη PASCAL. Ρεύμα Εισόδου / Εξόδου.. Ρεύμα Εισόδου / Εξόδου. To πρόγραμμα γραφικών gnuplot. Γραφικά στη PASCAL. Σκοπός 6.1 ΕΠΙΔΙΩΞΗ

Διαβάστε περισσότερα

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

Εισαγωγή στην Επιστήμη των Υπολογιστών Εισαγωγή στην Επιστήμη των Υπολογιστών 3η ενότητα: Αυτόματα και Τυπικές Γραμματικές http://www.corelab.ece.ntua.gr/courses/ Αυτόματα Τρόπος κωδικοποίησης αλγορίθμων. Τρόπος περιγραφής συστημάτων πεπερασμένων

Διαβάστε περισσότερα

Αλγόριθμοι για αυτόματα

Αλγόριθμοι για αυτόματα Κεφάλαιο 8 Αλγόριθμοι για αυτόματα Κύρια βιβλιογραφική αναφορά για αυτό το Κεφάλαιο είναι η Hopcroft, Motwani, and Ullman 2007. 8.1 Πότε ένα DFA αναγνωρίζει κενή ή άπειρη γλώσσα Δοθέντος ενός DFA M καλούμαστε

Διαβάστε περισσότερα

<<ΔΗΜΗΤΡΗΣ ΜΑΝΩΛΗΣ ΦΥΣΙΚΟΣ ΜCs>> 1

<<ΔΗΜΗΤΡΗΣ ΜΑΝΩΛΗΣ ΦΥΣΙΚΟΣ ΜCs>> 1 ΚΕΦΑΛΑΙΟ 7 ο ΠΡΟΓΡΑΜΜΑ : Το πρόγραμμα αποτελείται από μια σειρά οδηγιών, που ονομάζονται εντολές, για την εκτέλεση τέτοιου είδους πράξεων, καθώς επίσης και από ένα σύνολο πρόσθετων οδηγιών ελέγχου, που

Διαβάστε περισσότερα

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ KΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ http://www.cslab.ece.ntua.gr Λειτουργικά

Διαβάστε περισσότερα

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

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ Διδάσκουσα Δρ Β Καβακλή Χειμερινό Εξάμηνο 2001 Στόχοι του Μαθήματος! Ανάπτυξη αναλυτικής

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Μεταφραστές Λεκτικός αναλυτής Διδάσκων: Επικ. Καθ. Γεώργιος Μανής Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons.

Διαβάστε περισσότερα