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

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

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

Transcript

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

2

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

4 Σπύρος Χατζηχριστοδούλου Διπλωματούχος Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών Ε.Μ.Π. Copyright Σπύρος Χατζηχριστοδούλου, Με επιφύλαξη παντός δικαιώματος. 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 Ευχαριστίες Ευχαριστώ την οικογένεια, και κυρίως τους γονείς μου, που βρίσκονταν πάντα στο πλάι μου σε όλη τη διάρκεια της ακαδημαϊκής μου πορείας στο Εθνικό Μετσόβιο Πολυτεχνείο, τον καθηγητή μου κ. Παπασπύρου, που στα χρόνια τα οποία τον γνωρίζω ήταν μια συνεχής πηγή στήριξης και έμπνευσης για μένα, και όλα τα μέλη του Εργαστηρίου Τεχνολογίας Λογισμικού του Ε.Μ.Π. που πάντα έλυναν κάθε είδους απορία που εμφανιζόταν. Σπύρος Χατζηχριστοδούλου, Αθήνα, Ιουλίου Η εργασία αυτή είναι επίσης διαθέσιμη ως Τεχνική Αναφορά..., Εθνικό Μετσόβιο Πολυτεχνείο, Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών, Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών, Εργαστήριο Τεχνολογίας Λογισμικού, Ιούλιος 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 l e x e r. 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 y l e n g ; \ 16 r e t u r n _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

21 33 p r i n t { RETURN_TOKEN( T _ p r i n t, Keyword ) ; } 34 l e t { RETURN_TOKEN( T _ l e t, Keyword ) ; } 35 f o r { 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 i f { RETURN_TOKEN( T _ i f, Keyword ) ; } 40 then { RETURN_TOKEN( T_then, Keyword ) ; } 41 l e f i n { 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. { e x i t ( 1 ) ; } %% void y y e r r o r ( c o n s t c h a r *) 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 e n v i r o n m e n t. h 5 # i n c l u d e debug. h 6 %} 7 8 %union { 9 T o k e n T y p e S e l f ; 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_const %t o k e n T _ l e t l e t 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 p r i n t 24 %t o k e n T_for f o r 25 %t o k e n T_do do 26 %t o k e n T _ i f i f 27 %t o k e n T_then then Περιγραφή της MiniBasic για το εργαλείο bison 21

22 28 %t o k e n T _ f i n l e f i n 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 + 35 %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 : p r i n t expr 49 l e t IDENTIFIER = e x pr { New ( $2 ) ; S e t S t y l e ( Local ) ; S e t T o p L e v e l ( ) ; } 50 f o r expr do s t m t 51 begin s t m t _ l i s t end 52 i f expr then s t m t 53 ; expr : T_const 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 τις συντακτικές περιγραφές τους, έτσι ώστε

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 p r i n t = P r i n t 67 restores f o r = For 68 restores do = Do 69 restores b e g i n = Begin 70 restores end = End 71 restores i f = I f 72 restores t h e n = 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, ml, nl). Με τον τρόπο αυτό αναπαράστασης παρατηρούμε ότι εύκολα μπορούμε να αναπαραστήσουμε τον παλιό 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 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 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. Η απόδειξη τελειώνει ανάγοντας τα πιο πάνω στο πλήθος των συμβόλων στο αριστερότερο κλαδί. Πρόταση 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 σύμβολο παραμένει ίδιο. 45

46 Σύμφωνα με την Πρόταση 6.1, έχουμε δύο περιπτώσεις που αφορούν τον έλεγχο της τρέχουσας κατάστασης του συντακτικού αναλυτή σε σχέση μ αυτήν που είναι φυλαγμένη στη ρίζα του δέντρου που είναι υποψήφιο για επαναχρησιμοποίηση. Εάν ταιριάζουν, το δέντρο δεν μπορεί να μετακινηθεί, και κανένας από τους κόμβους που βρίσκονται στο αριστερό κλαδί του δέντρου αυτού δεν θα πρέπει να μετακινηθεί, έτσι χρειάζεται να απορριφθεί ολόκληρο εκτός από το φύλλο, το οποίο είναι τερματικός κόμβος. Η Αριστερή Διάσπαση την οποία περιγράψαμε πιο πάνω, έχει αυτόν ακριβώς τον ρόλο. Διασπώντας το δέντρο στο αριστερό του κλαδί, δεν σημαίνει ότι αυτόματα μπορούμε να διασπάσουμε τα εσωτερικά δέντρα, και κυρίως η διαδικασία αυτή δεν αποτελεί καμία εγγύηση για την ορθότητα της επαναχρησιμοποίησής τους. Για να δούμε εάν μπορούν να γίνουν αυτές οι ενέργειες, χρειάζεται τα εσωτερικά αυτά εναπομείναντα δέντρα να ξαναπεράσουν από ανάλυση. Στην άλλη περίπτωση όπου οι δύο καταστάσεις ταιριάζουν, εάν το look-ahead σύμβολο έχει αλλάξει, τότε θα πρέπει να προκύψει μία από τις αναγωγές στις οποίες αναφέρεται το δεξιό κλαδί, όπως καθορίζει και η Πρόταση 6.2. Έτσι, οι αναγωγές αυτές, ακυρώνονται από την διαδικασία της Δεξιάς Διάσπασης. 6.5 Μεταφέροντας τις Αλλαγές στο Ρεύμα Λεκτημάτων Μέχρι τώρα είδαμε πώς υλοποιείται ο αυξητικός συντακτικός αναλυτής χρησιμοποιώντας τη δομή των P-Trees, και αναλύσαμε πώς δέχεται λεκτήματα από το ρεύμα λεκτημάτων, τα αναλύει και κάνει τις κινήσεις που πρέπει (shift/reduce). Το μόνο θέμα που έμεινε να προσεγγίσουμε πριν περιγράψουμε αναλυτικά τους αλγορίθμους είναι το πώς οι αλλαγές που γίνονται από τον αυξητικό συντακτικό αναλυτή μεταφέρονται πίσω στο ρεύμα λεκτημάτων, έτσι ώστε να παραμένει πάντα ενημερωμένο. Δέντρα υποψήφια για επαναχρησιμοποίηση μπορεί να είναι μόνο αυτά για τα οποία η παραγωγή λεκτημάτων από τη ρίζα τους δεν έχει μεταβληθεί από το τελευταίο πέρασμα του συντακτικού αναλυτή. Το ρεύμα λεκτημάτων, όμως, μεταβάλλεται μεταξύ δύο διαδοχικών κλήσεων του συντακτικού αναλυτή, αλλιώς δεν θα υπάρχει ανάγκη για επανάκλησή του. Το τελευταίο βήμα που θα κάνουμε πριν περιγράψουμε λεπτομερώς τον αλγόριθμο αυξητικής συντακτικής ανάλυσης θα είναι να σχολιάσουμε τις αλλαγές αυτές και τις συνέπειές τους τόσο στο ρεύμα λεκτημάτων όσο και στον ίδιο τον συντακτικό αναλυτή μας. Τόσο στο [Jali82] όσο και στο [WAGN98] η ευθύνη για την τροποποίηση του συντακτικού δέντρου σαν άμεσο αποτέλεσμα των αλλαγών στο ρεύμα λεκτημάτων, αφήνεται στον ίδιο τον συντακτικό αναλυτή: στο πρώτο μέσω της διπλά συνδεδεμένης λίστας που υλοποιεί τον αυξητικό συντακτικό αναλυτή, και στο δεύτερο μέσω της ενδιάμεσης γλώσσας που επινοήθηκε στα [Wagn96] και [Wagn97] για την υλοποίηση ενός συντακτικού αναλυτή όπου το κατασκευαζόμενο AST κρατιέται πάντοτε ισοζυγισμένο και ενημερωμένο. Ο φυσικός τρόπος, όμως, θα ήταν οι αλλαγές αυτές στο συντακτικό δέντρο να γίνονται από τον λεκτικό και όχι το συντακτικό αναλυτή, αφού αυτός έχει πλήρη έλεγχο του ρεύματος λεκτημάτων. Όντως, στο [Lahaa] ακολουθείται αυτή η πιο φυσική προσέγγιση στο θέμα, δίνοντας δύο βασικά πλεονεκτήματα έναντι των προαναφερθέντων: Δεν υπάρχει ανάγκη για φύλαξη περίπλοκων αρχείων με πληροφορίες για τα αλλαγμένα λεκτήματα μεταξύ περασμάτων του συντακτικού αναλυτή όπως γίνεται στο [WAGN98], όπου χρησιμοποιείται ειδικά διαμορφωμένο version control για καλύτερες επιδόσεις Η δομή P-Tree περιέχει σε κάθε χρονική στιγμή ένα χρησιμοποιήσιμο ρεύμα από κόμβουςλεκτήματα, γεγονός που δίνει ακόμα ένα πλεονέκτημα στη χρησιμοποίησής της έναντι της κλασσικής στοίβας για την υλοποίηση του συντακτικού αναλυτή. Το μεγαλύτερο από τα μειονεκτήματα της συγκεκριμένης προσέγγισης, είναι ότι αποφάσεις αναφορικά με το συντακτικό δέντρο (ποιά μη τερματικά σύμβολα θα αναχθούν/μετακινηθούν, ποιά lookahead σύμβολα θα χρησιμοποιηθούν κ.λπ.) παίρνονται αρκετά πρόωρα, πριν ακόμα ολόκληρο το σύνολο των αλλαγών μεταξύ συντακτικών αναλύσεων του κειμένου εξεταστεί. Παρόλο που αυτό 46

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

48 το τελευταίο λέκτημα που περιέχεται εντός της διεγραμμένης περιοχής (γραμμή 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, έτσι η υλοποίησή του είναι σχετικά απλή. Ο αυξητικός χαρακτήρας προσδίδεται από την διαδικασία NEXT-TERMINAL, η οποία περιγράφεται στον Αλγόριθμο 7. Η διαδικασία αυτή καλείται όποτε ο συντακτικός αναλυτής ζητάει το επόμενο λέκτημα από το ρεύμα λεκτημάτων. Τότε η διαδικασία NEXT-TERMINAL βρίσκει τον πρώτο διαθέσιμο τερματικό κόμβο πάνω στο ρεύμα, καθώς χειρίζεται όλους τους μη τερματικούς κόμβους που βρίσκονται πριν από αυτόν. Η συνάρτηση δέχεται ένα όρισμα, το top, το οποίο περιγράφει την τρέχουσα κατάσταση του συντακτικού αναλυτή: είναι ένας δείκτης στον κόμβο του ρεύματος που αντιπροσωπεύει την αρχή της στοίβας η οποία υλοποιεί τον συντακτικό αναλυτή 3. Ξεκινά την λειτουργία της επαναληπτικά πάνω σε όλους τους κόμβους του ρεύματος των P-Trees. Χρησιμοποιώντας την παράμετρο top και την διαδικασία Next εξετάζουμε μόνο κόμβους που βρίσκονται πάνω στο ρεύμα, αφού τα αδέλφια κάθε κόμβου βρίσκονται και αυτά πάνω στο ρεύμα. Εάν ο προς εξέταση κόμβος είναι μη τερματικός, η 3 Στο [Lahaa] η συγκεκριμένη συνάρτηση εκτός από το top, περιγράφεται ώστε να επιδέχεται και μια δεύτερη παράμετρο, την state, η οποία είναι η τρέχουσα κατάσταση του συντακτικού αναλυτή. Κοιτάζοντας λιγάκι πιο προσεκτικά, βλέπουμε ότι η δεύτερη αυτή παράμετρος είναι όντως αχρείαστη, αφού περιγράφοντας την δομή P-Tree ορίσαμε και ένα πεδίο το οποίο κρατάει την κατάσταση του συντακτικού αναλυτή μετά την μετακίνηση του τρέχοντος κόμβου, έτσι δεν χρειάζεται να περαστεί σαν παράμετρος στην συνάρτησή μας αφού μπορεί να βρεθεί έμμεσα από την top 48

49 συνάρτηση χρησιμοποιεί το αριστερότερο τερματικό του σαν 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. 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. Έστω ότι θέλουμε να γράψουμε την εντολή print42. (η 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 Ανοδική Κατασκευή Συντακτικού Δέντρου κατασκευή δέντρου

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Αναδρομή. Τι γνωρίζετε για τη δυνατότητα «κλήσης» αλγορίθμων; Τι νόημα έχει;

Αναδρομή. Τι γνωρίζετε για τη δυνατότητα «κλήσης» αλγορίθμων; Τι νόημα έχει; ΜΑΘΗΜΑ 7 Κλήση αλγορίθμου από αλγόριθμο Αναδρομή Σ χ ο λ ι κ ο Β ι β λ ι ο ΥΠΟΚΕΦΑΛΑΙΟ 2.2.7: ΕΝΤΟΛΕΣ ΚΑΙ ΔΟΜΕΣ ΑΛΓΟΡΙΘΜΟΥ ΠΑΡΑΓΡΑΦΟI 2.2.7.5: Κλήση αλγορίθμου από αλγόριθμο 2.2.7.6: Αναδρομή εισαγωγη

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

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

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

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

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

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

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

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

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

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

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

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

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

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client ΕΣΔ 516 Τεχνολογίες Διαδικτύου Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client Περιεχόμενα Περιεχόμενα Javascript και HTML Βασική σύνταξη Μεταβλητές Τελεστές Συναρτήσεις

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

6. Εισαγωγή στον προγραµµατισµό

6. Εισαγωγή στον προγραµµατισµό 6. Εισαγωγή στον προγραµµατισµό 6.1 Η έννοια του προγράµµατος. 6.2 Ιστορική αναδροµή. 6.2.1 Γλώσσες µηχανής. ΗΜ04-Θ1Α 1. Ένα πρόγραµµα σε γλώσσα µηχανής είναι µια ακολουθία δυαδικών ψηφίων. 5. Ένα πρόγραµµα

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

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

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Δέντρα Αναζήτησης. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Δομές Δεδομένων Δέντρα Αναζήτησης Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Το πρόβλημα Αναζήτηση Θέλουμε να διατηρήσουμε αντικείμενα με κλειδιά και να μπορούμε εκτός από

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

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

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

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

Προγραμματισμός Υπολογιστών

Προγραμματισμός Υπολογιστών Προγραμματισμός Υπολογιστών Βασικές γνώσεις Κ. Βασιλάκης, ΣΤΕΦ, ΤΕΙ Κρήτης Η Πληροφορική και τα εργαλεία της Παροχή έγκαιρης και έγκυρης πληροφόρησης. Καταχώριση στοιχείων Αποθήκευση Επεξεργασία ψηφιακών

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

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

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

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

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

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 7.1. Ανάπτυξη Προγράµµατος Τι είναι το Πρόγραµµα; Το Πρόγραµµα: Είναι ένα σύνολο εντολών για την εκτέλεση ορισµένων λειτουργιών από τον υπολογιστή.

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

Μοντελοποίηση Υπολογισμού. Γραμματικές Πεπερασμένα Αυτόματα Κανονικές Εκφράσεις

Μοντελοποίηση Υπολογισμού. Γραμματικές Πεπερασμένα Αυτόματα Κανονικές Εκφράσεις Μοντελοποίηση Υπολογισμού Γραμματικές Πεπερασμένα Αυτόματα Κανονικές Εκφράσεις Προβλήματα - Υπολογιστές Δεδομένου ενός προβλήματος υπάρχουν 2 σημαντικά ερωτήματα: Μπορεί να επιλυθεί με χρήση υπολογιστή;

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

ΘΕΜΑ Α ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

ΘΕΜΑ Α ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ 1ΗΣ ΣΕΛΙΔΑΣ ΘΕΜΑ Α ΑΝΑΚΕΦΑΛΑΙΩΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ Γ' ΤΑΞΗΣ ΗΜΕΡΗΣΙΟΥ ΓΕΝΙΚΟΥ ΛΥΚΕΙΟΥ ΠΕΜΠΤΗ 26 ΑΠΡΙΛΙΟΥ 2012 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ (ΚΥΚΛΟΥ

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ ΥΠΟΛΟΓΙΣΜΩΝ ΚΑΙ ΑΥΤΟΜΑΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ ΥΠΟΛΟΓΙΣΜΩΝ ΚΑΙ ΑΥΤΟΜΑΤΩΝ Τελικές εξετάσεις 3 Ιανουαρίου 27 Διάρκεια εξέτασης: 3 ώρες (2:-5:) ΘΕΜΑ ο

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

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Εισαγωγή στην FORTRAN. Δρ. Ιωάννης Λυχναρόπουλος 2014-2015 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Εισαγωγή στην FORTRAN Δρ. Ιωάννης Λυχναρόπουλος 2014-2015 Fortran FORmula TRANslation: (Μία από τις πρώτες γλώσσες τρίτης γενιάς) Εκδόσεις FORTRAN (1957) FORTRAN II (1958) FORTRAN III

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

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής Ενότητα 8: Γραμμική Αναζήτηση και Δυαδική Αναζήτηση-Εισαγωγή στα Δέντρα και Δυαδικά Δέντρα-Δυαδικά Δέντρα Αναζήτησης & Υλοποίηση ΔΔΑ με δείκτες Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό

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

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

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL) Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL) Pascal- Εισαγωγή Η έννοια του προγράμματος Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει, όπως έχει ήδη αναφερθεί, τρία εξίσου

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

Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον

Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον Κεφάλαιο 6ο Εισαγωγή στον Προγραµµατισµό Μέρος Πρώτο (6.1, 6.2 και 6.3) Α. Ερωτήσεις Σωστού Λάθους 1. Η γλώσσα µηχανής είναι µία γλώσσα υψηλού επιπέδου.

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

Εκφώνηση άσκησης. Η Κρεμάλα σαν παιχνίδι. Ανάλυση. Μέρος Α Αναφoρά, ανάλυση τακτικής. Υλοποίηση του παιχνιδιού «Κρεμάλα»

Εκφώνηση άσκησης. Η Κρεμάλα σαν παιχνίδι. Ανάλυση. Μέρος Α Αναφoρά, ανάλυση τακτικής. Υλοποίηση του παιχνιδιού «Κρεμάλα» ΚΡΕΜΑΛΑ Project 7 1 Εκφώνηση άσκησης Υλοποίηση του παιχνιδιού «Κρεμάλα» Το Project αυτό συνίσταται στην κατασκευή ενός προγράμματος σεναρίου κελύφους, που θα υλοποιεί το γνωστό παιχνίδι «Κρεμάλα» με δυνατότητα

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

Εισαγωγή. Κεφάλαιο 1. 1.1 Γλωσσικοί Επεξεργαστές

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

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

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

Μεταγλωττιστές. Δημήτρης Μιχαήλ. Ακ. Έτος 2011-2012. Εισαγωγή. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Μεταγλωττιστές Εισαγωγή Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2011-2012 Βιβλιογραφία Alfred V. Aho, Monica S. Lam, Ravi Sethi and Jeffrey D. Ullman. Compilers:

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

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

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Πανεπιστήμιο Δυτικής Μακεδονίας Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εισαγωγή Κώστας Στεργίου Τι είναι ο Η/Υ; Ένας ηλεκτρονικός υπολογιστής (Η/Υ) είναι

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

Κεφάλαιο 1: Εισαγωγή. Αρχές Γλωσσών και Προγραμματισμού και Μεταφραστών. Γιάννης Γαροφαλάκης ΤΜΗΥΠ - Πανεπιστήμιο Πατρών

Κεφάλαιο 1: Εισαγωγή. Αρχές Γλωσσών και Προγραμματισμού και Μεταφραστών. Γιάννης Γαροφαλάκης ΤΜΗΥΠ - Πανεπιστήμιο Πατρών Κεφάλαιο 1: Εισαγωγή Αρχές Γλωσσών και Προγραμματισμού και Μεταφραστών Εισαγωγή (1) Γιατί υπάρχουν τόσες πολλές Γλώσσες Προγραμματισμού (ΓΠ); o Εξέλιξη έχουμε μάθει καλύτερους τρόπους να κάνουμε πράγματα

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

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

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

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

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

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

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

Τυπικές χρήσεις της Matlab

Τυπικές χρήσεις της Matlab Matlab Μάθημα 1 Τι είναι η Matlab Ολοκληρωμένο Περιβάλλον Περιβάλλον ανάπτυξης Διερμηνευμένη γλώσσα Υψηλή επίδοση Ευρύτητα εφαρμογών Ευκολία διατύπωσης Cross platform (Wintel, Unix, Mac) Τυπικές χρήσεις

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

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010 Τμήμα Πληροφορικής & Επικοινωνιών Τομέας Υπολογιστικών Τεχνικών & Συστημάτων Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010 Ιωάννης Γεωργουδάκης - Πάρις Μαστοροκώστας Σεπτέμβριος 2011 ΠΕΡΙΕΧΟΜΕΝΑ

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

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

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

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

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ ΘΕΜΑ 1 ο : Α. Να αναφέρετε ονομαστικά τις βασικές λειτουργίες (πράξεις) επί των δομών δεδομένων. Μονάδες 8 Β. Στον

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

ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 1.3-1.4: Εισαγωγή Στον Προγραµµατισµό ( ιάλεξη 2) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Περιεχόµενα Εισαγωγικές Έννοιες - Ορισµοί Ο κύκλος ανάπτυξης προγράµµατος Παραδείγµατα Πότε χρησιµοποιούµε υπολογιστή?

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

2 ΟΥ και 7 ΟΥ ΚΕΦΑΛΑΙΟΥ

2 ΟΥ και 7 ΟΥ ΚΕΦΑΛΑΙΟΥ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΙΜΕΛΕΙΑ: ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ 2 ΟΥ και 7 ΟΥ ΚΕΦΑΛΑΙΟΥ ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΑΛΓΟΡΙΘΜΩΝ και ΔΟΜΗ ΑΚΟΛΟΥΘΙΑΣ 2.1 Να δοθεί ο ορισμός

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

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

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

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

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

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

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

Διάλεξη 14: Δέντρα IV B Δένδρα. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 14: Δέντρα IV B Δένδρα. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 14: Δέντρα IV B Δένδρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: 2 3 Δένδρα, Εισαγωγή και άλλες πράξεις Άλλα Δέντρα: Β δένδρα, Β+ δέντρα, R δέντρα Διδάσκων: Παναγιώτης Ανδρέου ΕΠΛ231

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΑΚΩΝ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΠΡΟΠΤΥΧΙΑΚΟ ΠΡΟΓΡΑΜΜΑ ΣΠΟΥΔΩΝ ΜΑΘΗΜΑ: ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ ΜΟΝΤΕΛΑ ΣΥΣΤΗΜΑΤΟΣ Διδάσκων: Γ. Χαραλαμπίδης, Επ. Καθηγητής

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

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

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

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

Περιεχόμενα. Δομές δεδομένων. Τεχνικές σχεδίασης αλγορίθμων. Εισαγωγή στον προγραμματισμό. Υποπρογράμματα. Επαναληπτικά κριτήρια αξιολόγησης

Περιεχόμενα. Δομές δεδομένων. Τεχνικές σχεδίασης αλγορίθμων. Εισαγωγή στον προγραμματισμό. Υποπρογράμματα. Επαναληπτικά κριτήρια αξιολόγησης Περιεχόμενα Δομές δεδομένων 37. Δομές δεδομένων (θεωρητικά στοιχεία)...11 38. Εισαγωγή στους μονοδιάστατους πίνακες...16 39. Βασικές επεξεργασίες στους μονοδιάστατους πίνακες...25 40. Ασκήσεις στους μονοδιάστατους

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

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

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 1 Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Υλοποίηση ΑΤΔ με Συνδεδεμένες Λίστες -

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

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

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

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

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ 2013-2014 ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ 2013-2014 Επιμέλεια: Ομάδα Διαγωνισμάτων από το Στέκι των Πληροφορικών Θέμα Α A1. Να γράψετε στο τετράδιό σας τους

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

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή Στο εργαστήριο αυτό θα μάθουμε για τη χρήση συναρτήσεων με σκοπό την κατασκευή αυτόνομων τμημάτων προγραμμάτων που υλοποιούν μία συγκεκριμένη διαδικασία, τα οποία

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

2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ

2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΙΜΕΛΕΙΑ: ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΘΕΩΡΙΑ 2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ 1) Πότε χρησιμοποιείται η δομή επανάληψης

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

Περιεχόμενα. Περιεχόμενα

Περιεχόμενα. Περιεχόμενα Περιεχόμενα xv Περιεχόμενα 1 Αρχές της Java... 1 1.1 Προκαταρκτικά: Κλάσεις, Τύποι και Αντικείμενα... 2 1.1.1 Βασικοί Τύποι... 5 1.1.2 Αντικείμενα... 7 1.1.3 Τύποι Enum... 14 1.2 Μέθοδοι... 15 1.3 Εκφράσεις...

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

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative

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

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

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

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

ΚΕΦΑΛΑΙΟ 1ο 3ο. ΚΕΦΑΛΑΙΟ 5ο 6ο. ΚΕΦΑΛΑΙΟ 7ο. Δομημένος Προγραμματισμός - Γενικές Ασκήσεις Επανάληψης

ΚΕΦΑΛΑΙΟ 1ο 3ο. ΚΕΦΑΛΑΙΟ 5ο 6ο. ΚΕΦΑΛΑΙΟ 7ο. Δομημένος Προγραμματισμός - Γενικές Ασκήσεις Επανάληψης ΚΕΦΑΛΑΙΟ 1ο 3ο 1. Συμπληρώστε τα κενά με τη λέξη που λείπει. α. Ένα πρόβλημα το χωρίζουμε σε άλλα απλούστερα, όταν είναι ή όταν έχει τρόπο επίλυσης. β. Η επίλυση ενός προβλήματος προϋποθέτει την του. γ.

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

Εισαγωγή στο Συναρτησιακό Προγραμματισμό

Εισαγωγή στο Συναρτησιακό Προγραμματισμό Εισαγωγή στο Συναρτησιακό Προγραμματισμό Γιάννης Κασσιός Σε αυτό το μάθημα θα εξερευνήσουμε ένα σπουδαίο μοντέλο προγραμματισμού, το συναρτησιακό προγραμματισμό. Θα δούμε το συναρτησιακό προγραμματισμό

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΗΥ340 ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΗΥ340 ΕΑΡΙΝΟ ΕΞΑΜΗΝΟ 2008 ΔΙΔΑΣΚΩΝ: ΑΝΤΩΝΙΟΣ ΣΑΒΒΙΔΗΣ ΒΑΣΙΚΗ ΕΡΓΑΣΙΑ ΦΑΣΗ 2η από 5 Παράδοση: Πέμπτη 10 Απριλίου 2008, 24:00 (μεσάνυχτα)

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

Προγραµµατισµός Η/Υ. Μέρος2

Προγραµµατισµός Η/Υ. Μέρος2 Προγραµµατισµός Η/Υ Μέρος2 Περιεχόμενα Επανάληψη Βασικών Σύμβολων Διαγραμμάτων Ροής Αλγόριθμος Ψευδοκώδικας Παραδείγματα Αλγορίθμων Γλώσσες προγραμματισμού 2 Επανάληψη Βασικών Σύμβολων Διαγραμμάτων Ροής

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

Περιληπτικά, τα βήματα που ακολουθούμε γενικά είναι τα εξής:

Περιληπτικά, τα βήματα που ακολουθούμε γενικά είναι τα εξής: Αυτό που πρέπει να θυμόμαστε, για να μη στεναχωριόμαστε, είναι πως τόσο στις εξισώσεις, όσο και στις ανισώσεις 1ου βαθμού, που θέλουμε να λύσουμε, ακολουθούμε ακριβώς τα ίδια βήματα! Εκεί που πρεπει να

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

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Μια δομή δεδομένων στην πληροφορική, συχνά αναπαριστά οντότητες του φυσικού κόσμου στον υπολογιστή. Για την αναπαράσταση αυτή, δημιουργούμε πρώτα ένα αφηρημένο μοντέλο στο οποίο προσδιορίζονται

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

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

ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / Γ ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ: 27/01/2013 ΜΑΘΗΜΑ / ΤΑΞΗ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / Γ ΕΠΑΛ ΣΕΙΡΑ: ΗΜΕΡΟΜΗΝΙΑ: 27/01/2013 ΘΕΜΑ Α Α1. Να χαρακτηρίσετε τις προτάσεις που ακολουθούν, γράφοντας δίπλα στο γράμμα που αντιστοιχεί σε κάθε πρόταση τη

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

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της;

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της; 1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες (μορφές) της; Η δομή επανάληψης χρησιμοποιείται όταν μια σειρά εντολών πρέπει να εκτελεστεί σε ένα σύνολο περιπτώσεων, που έχουν κάτι

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

Σύνταξη & Συντακτική Ανάλυση

Σύνταξη & Συντακτική Ανάλυση Σύνταξη & Συντακτική Ανάλυση Μια γραμματική για τα Αγγλικά Μια πρόταση αποτελείται από μια ουσιαστική φράση, ένα ρήμα, και μια ουσιαστική φράση ::= Μια ουσιαστική φράση αποτελείται από

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

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 12: Δέντρα ΙΙ -Δυαδικά Δέντρα Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Δυαδικά Δένδρα - Δυαδικά Δένδρα Αναζήτησης(ΔΔΑ) - Εύρεση Τυχαίου, Μέγιστου, Μικρότερου στοιχείου - Εισαγωγή

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

Πληρουορική Γ Γσμμασίοσ

Πληρουορική Γ Γσμμασίοσ Πληρουορική Γ Γσμμασίοσ Προγραμματισμός και Αλγόριθμοι Από το και τημ Χελώμα στημ Ευριπίδης Βραχνός http://evripides.mysch.gr/ 2014 2015 1 Προγραμματισμός Ζάννειο Πρότυπο Πειραματικό Γυμνάσιο Πειραιά Ενότητα:

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

Δομές Δεδομένων Εργαστηριακή Άσκηση 2012-2013. Γκόγκος Νίκος Α.Μ.: 4973 Έτος: 3 ο Email: gkogkos@ceid.upatras.gr. Εισαγωγικά:

Δομές Δεδομένων Εργαστηριακή Άσκηση 2012-2013. Γκόγκος Νίκος Α.Μ.: 4973 Έτος: 3 ο Email: gkogkos@ceid.upatras.gr. Εισαγωγικά: Δομές Δεδομένων Εργαστηριακή Άσκηση 2012-2013 Γκόγκος Νίκος Α.Μ.: 4973 Έτος: 3 ο Email: gkogkos@ceid.upatras.gr Εισαγωγικά: Η υλοποίηση του project έχει γίνει σε python [2.7]. Τα python modules είναι αυτόνομα

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

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ Διάλεξη 2 Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις Διοργάνωση : ΚΕΛ ΣΑΤΜ Διαφάνειες: Skaros, MadAGu Παρουσίαση: MadAGu Άδεια: Creative Commons 3.0 2 Internal

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

53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η

53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η 53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η ΠΑΓΚΡΑΤΙ: Φιλολάου & Εκφαντίδου 26 : 210/76.01.470 210/76.00.179 ΘΕΜΑ Α Α1. Να γράψετε στο τετράδιό σας τον αριθμό καθεμιάς

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

ΚΕΦΑΛΑΙΟ 18. 18 Μηχανική Μάθηση

ΚΕΦΑΛΑΙΟ 18. 18 Μηχανική Μάθηση ΚΕΦΑΛΑΙΟ 18 18 Μηχανική Μάθηση Ένα φυσικό ή τεχνητό σύστηµα επεξεργασίας πληροφορίας συµπεριλαµβανοµένων εκείνων µε δυνατότητες αντίληψης, µάθησης, συλλογισµού, λήψης απόφασης, επικοινωνίας και δράσης

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

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Εργαστήριο 1 Εισαγωγή στη C Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr Διαδικαστικά Ιστοσελίδα μαθήματος: http://eclass.uoa.gr/courses/f30/ Υποχρεωτική παρακολούθηση: Παρασκευή 14:00 16:00 στην

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

Λειτουργικά. Τεχνολογικό Εκπαιδευτικό Ίδρυμα Δυτικής Μακεδονίας Σιώζιος Κων/νος - Πληροφορική Ι

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

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

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Βασικές Έννοιες Προγραμματισμού. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Βασικές Έννοιες Προγραμματισμού. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Βασικές Έννοιες Προγραμματισμού Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD Αριθμητικά συστήματα Υπάρχουν 10 τύποι ανθρώπων: Αυτοί

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

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ Σχεδιασμός και υλοποίηση υποδομής σημείωσης διεργασιών στον

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

Σενάριο 14: Προγραμματίζοντας ένα Ρομπότ ανιχνευτή

Σενάριο 14: Προγραμματίζοντας ένα Ρομπότ ανιχνευτή Σενάριο 14: Προγραμματίζοντας ένα Ρομπότ ανιχνευτή Ταυτότητα Σεναρίου Τίτλος: Προγραμματίζοντας ένα Ρομπότ ανιχνευτή Γνωστικό Αντικείμενο: Πληροφορική Διδακτική Ενότητα: Ελέγχω-Προγραμματίζω τον Υπολογιστή

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

ΚΕΦΑΛΑΙΟ VI. Εισαγωγή στον προγραμματισμό

ΚΕΦΑΛΑΙΟ VI. Εισαγωγή στον προγραμματισμό ΚΕΦΑΛΑΙΟ VI Η επίλυση ενός προβλήματος με τον υπολογιστή περιλαμβάνει, όπως έχει ήδη αναφερθεί, τρία εξίσου σημαντικά στάδια. Τον ακριβή προσδιορισμό του προβλήματος. Την ανάπτυξη του αντίστοιχου αλγορίθμου.

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

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Εισαγωγή Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Βιβλιογραφία "C Προγραμματισμός", Deitel & Deitel, Πέμπτη Έκδοση, Εκδόσεις

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

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

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΧΗΜΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΟ ΚΕΝΤΡΟ Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού Μάθημα 2ο Aντώνης Σπυρόπουλος v2_061015 Οροι που

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΗΥ340 ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΗΥ340 ΕΑΡΙΝΟ ΕΞΑΜΗΝΟ 2010 Ι ΑΣΚΩΝ: ΑΝΤΩΝΙΟΣ ΣΑΒΒΙ ΗΣ ΒΑΣΙΚΗ ΕΡΓΑΣΙΑ ΦΑΣΗ 2η από 5 Ανάθεση: Πέµπτη 15 Απριλίου 2010, 11:00 (πρωί)

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

Εξεταστέα Ύλη (Syllabus) Έκδοση 5.0

Εξεταστέα Ύλη (Syllabus) Έκδοση 5.0 Εξεταστέα Ύλη (Syllabus) Έκδοση 5.0 Πνευματικά Δικαιώματα 2007 Ίδρυμα ECDL (ECDL Foundation www.ecdl.org) Όλα τα δικαιώματα είναι κατοχυρωμένα. Κανένα μέρος αυτού του εγγράφου δεν μπορεί να αναπαραχθεί

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

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή 1. Ηλεκτρονικός Υπολογιστής Ο Ηλεκτρονικός Υπολογιστής είναι μια συσκευή, μεγάλη ή μικρή, που επεξεργάζεται δεδομένα και εκτελεί την εργασία του σύμφωνα με τα παρακάτω

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

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

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Κατακερματισμός. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Δομές Δεδομένων Κατακερματισμός Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Λεξικό Dictionary Ένα λεξικό (dictionary) είναι ένας αφηρημένος τύπος δεδομένων (ΑΤΔ) που διατηρεί

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

Βάσεις δεδομένων (Access)

Βάσεις δεδομένων (Access) Βάσεις δεδομένων (Access) Όταν εκκινούμε την Access εμφανίζεται το παρακάτω παράθυρο: Για να φτιάξουμε μια νέα ΒΔ κάνουμε κλικ στην επιλογή «Κενή βάση δεδομένων» στο Παράθυρο Εργασιών. Θα εμφανιστεί το

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

Δυναμικά Πολυεπίπεδα Ευρετήρια (Β-δένδρα) Μ.Χατζόπουλος 1

Δυναμικά Πολυεπίπεδα Ευρετήρια (Β-δένδρα) Μ.Χατζόπουλος 1 Δυναμικά Πολυεπίπεδα Ευρετήρια (Β-δένδρα) Μ.Χατζόπουλος 1 Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ.Χατζόπουλος 2 Δένδρο αναζήτησης είναι ένας ειδικός τύπος δένδρου που χρησιμοποιείται για να καθοδηγήσει την αναζήτηση μιας

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

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

ΕΙΣΑΓΩΓΗ ΣΤOΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΕΙΣΑΓΩΓΗ ΣΤOΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Στόχοι του μαθήματος Μετά το τέλος του μαθήματος οι μαθητές πρέπει να είναι σε θέση: Να περιγράφουν τι είναι πρόγραμμα Να εξηγούν την αναγκαιότητα για τη δημιουργία γλωσσών

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

ΔΙΔΑΣΚΑΛΙΑ ΤΗΣ ΕΝΝΟΙΑΣ ΤΟΥ ΟΡΙΟΥ ΣΥΝΑΡΤΗΣΗΣ

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

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

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα Καθηγήτρια Μαρία Σατρατζέμη Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό

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

Μέρος Α. Λογισµικό & Προγράµµατα συστήµατος και εφαρµογών ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ. Το σηµερινό µάθηµα. Λογισµικό συστηµάτων & εφαρµογών

Μέρος Α. Λογισµικό & Προγράµµατα συστήµατος και εφαρµογών ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ. Το σηµερινό µάθηµα. Λογισµικό συστηµάτων & εφαρµογών ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΟΙΚΟΝΟΜΙΑΣ ΚΑΙ ΙΟΙΚΗΣΗΣ Το σηµερινό µάθηµα ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ιδάσκων: Πέτρος Βασιλικός Λογισµικό Υπολογιστικών Συστηµάτων Λογισµικό & Προγράµµατα συστηµάτων

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

Τεχνητή Νοημοσύνη. 2η διάλεξη (2015-16) Ίων Ανδρουτσόπουλος. http://www.aueb.gr/users/ion/

Τεχνητή Νοημοσύνη. 2η διάλεξη (2015-16) Ίων Ανδρουτσόπουλος. http://www.aueb.gr/users/ion/ Τεχνητή Νοημοσύνη 2η διάλεξη (2015-16) Ίων Ανδρουτσόπουλος http://www.aueb.gr/users/ion/ 1 Οι διαφάνειες αυτής της διάλεξης βασίζονται στα βιβλία: Τεχνητή Νοημοσύνη των Βλαχάβα κ.ά., 3η έκδοση, Β. Γκιούρδας

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 6 ο

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 6 ο Με τι ασχολείται ο προγραμματισμός; Ο προγραμματισμός ασχολείται με την διατύπωση του αλγορίθμου σε κατανοητή μορφή από τον Η/Υ, δηλ. τη δημιουργία του προγράμματος, του συνόλου των εντολών που πρέπει

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

Πώς μπορούμε να δημιουργούμε γεωμετρικά σχέδια με τη Logo;

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

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

Στοίβες με Δυναμική Δέσμευση Μνήμης

Στοίβες με Δυναμική Δέσμευση Μνήμης ΕΠΛ 231 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ 10/02/10 Παύλος Αντωνίου Στοίβες με Δυναμική Δέσμευση Μνήμης Στοίβα: Στοίβα είναι μια λίστα που έχει ένα επιπλέον περιορισμό. Ο περιορισμός είναι ότι οι εισαγωγές

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