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

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

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

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

Σχεδίαση Γλωσσών & Μεταγλωττιστζς

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

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

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

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

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

Πίνακας Περιεχοµένων Πρόλογος Κεφάλαιο Βασικές εισαγωγικές έννοιες

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

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

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

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

Θεωρία Υπολογισμού και Πολυπλοκότητα Ασυμφραστικές Γλώσσες (1)

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

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

Πανεπιστήμιο Δυτικής Μακεδονίας Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών (Κοζάνη) Χειμ. Εξ '15

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

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

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

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

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

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

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

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

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

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

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

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

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

Σειρά Προβλημάτων 3 Λύσεις

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

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

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

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

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

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

Δομές Δεδομένων (Data Structures)

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

Σειρά Προβλημάτων 3 Λύσεις

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

Θεωρία Υπολογισμού και Πολυπλοκότητα Ασυμφραστικές Γλώσσες (2)

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

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

Περιεχόμενα Τι περιγράφει ένα ΣΔ ΣΔ και παραγωγές Θεωρία Υπολογισμού Ενότητα 15: Συντακτικά Δέντρα Επ. Καθ. Π. Κατσαρός Τμήμα Πληροφορικής Επ. Καθ. Π.

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

ιαφάνειες παρουσίασης #3

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

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

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

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

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

Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο.

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

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

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

Προγραμματισμός ΗΥ και Υπολογιστική Φυσική. Χρήστος Γκουμόπουλος

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

Θεωρία Υπολογισμού και Πολυπλοκότητα Ασυμφραστικές Γλώσσες (3)

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

for for for for( . */

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

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

HY Λογική Διδάσκων: Δ. Πλεξουσάκης Εαρινό Εξάμηνο. Φροντιστήριο 6

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

Προγραμματισμός Ι (ΗΥ120)

Top Down Bottom Up. Συντακτική Ανάλυση. Συντακτική Ανάλυση για Γραµµατικές χωρίς Συµφραζόµενα (top-down - Earley)

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

ΕΠΛ 211: Θεωρία Υπολογισμού και Πολυπλοκότητας. Διάλεξη 11: Μη Ασυμφραστικές Γλώσσες

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

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

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

Σειρά Προβλημάτων 4 Λύσεις

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

Αναδρομικοί Αλγόριθμοι

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

Διδάσκων: Κωνσταντίνος Κώστα

Ο βρόχος for Η εντολή for χρησιμοποιείται για τη δημιουργία επαναληπτικών βρόχων στη C

ΚΕΦΑΛΑΙΟ 4 ΒΑΣΙΚΕΣ ΤΕΧΝΙΚΕΣ ΣΥΝΤΑΚΤΙΚΗΣ ΑΝΑΛΥΣΗΣ

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

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύ

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

Θα χρησιμοποιήσουμε το bison, μια βελτιωμένη έκδοση του yacc. Φροντιστήριο 2ο Εισαγωγή στο YACC. Yacc. Δομή Προγράμματος Yacc

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

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

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

Μεταγλωττιστές. μια φοιτητική προσέγγιση

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

Μαθηματικά Γ Γυμνασίου

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

Ν!=1*2*3* *(N-1) * N => N! = (Ν-1)! * N έτσι 55! = 54! * 55

Διάλεξη 19: Αλγόριθμοι ΤαξινόμησηςII. Διδάσκων: Παναγιώτης Ανδρέου

Υπολογισμός - Εντολές Ελέγχου

ΗΥ101: Εισαγωγή στην Πληροφορική

Transcript:

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

Καθοδική Ανάλυση Ξεκινά από τη αρχή της γραμματικής (ρίζα δένδρου) για να αναπτύξει τη συμβολοσειρά, που αναλύει, αν αυτή αποτελεί πρόταση. Καμία από τις τεχνικές που θα εξετάσουμε δεν μπορεί να εφαρμοσθεί σε αριστερά αναδρομικές γραμματικές. Διακρίνουμε της τεχνικές της οπισθοδρόμησης και τις τεχνικές της πρόγνωσης.

Καθοδική ανάλυση με οπισθοδρόμηση Ι 1. Δοθέντος συγκεκριμένου μη τερματικού συμβόλου εφαρμόζεται ο πρώτος κανόνας της γραμματικής. 2. Στην προτασιακή μορφή, που προκύπτει επιλέγεται το πρώτο από αριστερά μη τερματικό σύμβολο και εφαρμόζεται ο πρώτος κανόνας, που αναφέρεται σε αυτό. 3. Γίνεται επαναληπτική εφαρμογή του βήματος 2, για κάθε ένα από τα μη τερματικά σύμβολα, που ακολουθούν, μέχρι τη στιγμή της παραγωγής, μιας σειράς τερματικών συμβόλων (πρόταση γλώσσας αν ταυτίζεται) ή τμήματος τερματικών συμβόλων της προτασιακής μορφής, που διαφέρει από το αντίστοιχο τμήμα της συμβολοσειράς εισόδου Η δεύτερη περίπτωση μπορεί να είναι αποτέλεσμα εσφαλμένης επιλογής κανόνα. Αναιρείται ο κανόνας που εφαρμόσθηκε τελευταίος και χρησιμοποιείται ο επόμενος που ισχύει για το ίδιο μη τερματικό σύμβολο. Αν έχουν χρησιμοποιηθεί όλοι οι κανόνες, τότε ο αλγόριθμος διατηρεί το σύμβολο ως έχει και προχωρά στην αναίρεση του κανόνα για το προηγούμενο μη τερματικό σύμβολο και οπισθοδρομεί στην κατάλληλη θέση της συμβολοσειράς εισόδου.

Παράδειγμα ανάγκης καθοδικής ανάλυσης με οπισθοδρόμηση Γραμματική L: ΕΝΤΟΛΗ ΕΝΤΟΛΗ-Α ΕΝΤΟΛΗ-Β ΕΝΤΟΛΗ-Α if ΣΥΝΘΗΚΗ then ΕΝΤΟΛΗ-Α else ΕΝΤΟΛΗ-Α άλλη εντολή ΕΝΤΟΛΗ-Β if ΣΥΝΘΗΚΗ then ΕΝΤΟΛΗ if ΣΥΝΘΗΚΗ then ΕΝΤΟΛΗ-Α else ΕΝΤΟΛΗ-Β 4

Παράδειγμα Καθοδικής ανάλυσης με οπισθοδρόμηση ΠΑΡΑΔΕΙΓΜΑ S kxn ky S S S X l m Y m m n n n m k X n k X n Συμβολοσειρά προς αναγνώριση: kmmm (α) (β) (γ) S S S l k X n k m Y k Y m m (δ) (ε) (ζ) m 5

Καθοδική ανάλυση με οπισθοδρόμηση ΙΙI Ιδιαίτερα πολύπλοκη Όχι αποδοτική Αρκετά γενική, δηλ. αναγνωρίζει πιο πολλές γλώσσες από τις άλλες τεχνικές καθοδικής ανάλυσης Αργεί στον εντοπισμό των λαθών και έτσι η ανάνηψη γίνεται πολύ δύσκολη

Ανάλυση προβλέπουσας αναδρομικής κατάβασης Ι Στην ανάλυση αναδρομικής κατάβασης ο κάθε κανόνας, που αναφέρεται σε κάποιο μη τερματικό σύμβολο, εκφράζεται από τον ορισμό μιας διαδικασίας, που θα το αναγνωρίζει. Ένας αναλυτής προβλέπουσας αναδρομικής κατάβασης αποτελείται: από μία καθολική μεταβλητή, που περιέχει την τιμή της τρέχουσας λεξικής μονάδας από μία βοηθητική διαδικασία αναγνώρισης, που ελέγχει αν η τρέχουσα λεξική μονάδα είναι η αναμενόμενη και καλεί τη διαδικασία λεξικής ανάλυσης, για την ανάγνωση της επόμενης λεξικής μονάδας και την ενημέρωση της καθολικής μεταβλητής από τις διαδικασίες ανάλυσης, που αντιστοιχούν στα μη τερματικά σύμβολα της γραμματικής από μια διαδικασία εκκίνησης, που αφού διαβάσει την πρώτη λεξική μονάδα καλεί τη διαδικασία, που αντιστοιχεί στο μη τερματικό σύμβολο της αρχής.

Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙ ΠΑΡΑΔΕΙΓΜΑ S=έκφραση. έκφραση = έκφραση + όρος έκφραση όρος όρος. όρος = όρος * παράγοντας όρος / παράγοντας παράγοντας. παράγοντας = ( έκφραση ) αριθμός. παράγοντας: Επέλεξε ΛΕΞ_ΜΟΝ περίπτωση ( : αναγνώρισε ( ( ); έκφραση; αναγνώρισε ( ) ); περίπτωση αριθμός : αναγνώρισε( αριθμός ); αλλιώς: λάθος; Τέλος παράγοντα. //αν_λεξ_μον: αναμενόμενη λεξ. μονάδα αναγνώρισε (αν_λεξ_μον): αν (ΛΕΞ_ΜΟΝ=αν_λεξ_μον) τότε διάβασε την επόμενη μονάδα και ενημέρωσε τη μεταβλητή ΛΕΞ_ΜΟΝ; αλλιώς λάθος; τέλος αν Τέλος αναγνώρισε.

Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙI Η προβλέπουσα αναδρομική κατάβαση στηρίζεται στην πρόγνωση του κατάλληλου κάθε φορά κανόνα, που οδηγεί στην παραγωγή του δένδρου της πρότασης. Δε μπορεί να εφαρμοσθεί σε αριστερά αναδρομικές γραμματικές, όπως αυτή του προηγούμενου παραδείγματος. Ας θεωρήσουμε τη μη αριστερά αναδρομική γραμματική των αριθμητικών εκφράσεων: S=έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = + όρος υπ_όροι - όρος υπ_όροι ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = * παράγοντας υπ_παραγ / παράγοντας υπ_παραγ ε. παράγοντας = ( έκφραση ) αριθμός.

Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙV Για το μη τερματικό σύμβολο «έκφραση», μπορεί εναλλακτικά να έχουμε την παραγωγή, έκφραση όρος υπ_όροι παράγοντας υπ_παραγ υπ_όροι (έκφραση) υπ_παραγ υπ_όροι... ή την παραγωγή έκφραση όρος υπ_όροι παράγοντας υπ_παραγ υπ_όροι αριθμός υπ_παραγ υπ_όροι.... Γενικά, για να στηριχθεί η ανάλυση στην τεχνική της πρόγνωσης χρειάζεται για κάθε μη τερματικό σύμβολο, να είναι εκ των προτέρων γνωστό τo σύνολο των τερματικών, που είναι δυνατό να εμφανισθούν στην αρχή των συμβολοσειρών, που παράγονται από αυτό (σύνολο FIRST). Επιπλέον, αν η γραμματική περιλαμβάνει κανόνες ε, τότε για κάθε μη τερματικό σύμβολο που βρίσκεται στο αριστερό μέρος ενός τέτοιου κανόνα, επιβάλλεται και ο υπολογισμός του συνόλου των τερματικών, που μπορεί να εμφανισθούν αμέσως μετά από αυτό (σύνολο FOLLOW).

Ανάλυση προβλέπουσας αναδρομικής κατάβασης V Ανάλυση πρόγνωσης: κεντρική ιδέα Δοθείσης μιας παραγωγής A, ο αναλυτής πρέπει να είναι σε θέση να επιλέξει μεταξύ & Σύνολα FIRST Για ένα δεξί μέρος παραγωγής G, ορίζουμε ως FIRST( ) το σύνολο των αναγνωριστικών που εμφανίζονται πρώτα στις συμβολοσειρές που παράγονται από το. Δηλαδή ισχύει, x FIRST( ) αν και μόνο αν * x, για κάποια συμβολοσειρά Γραμματική LL(1) Αν A και A εμφανίζονται στη γραμματική πρέπει FIRST( ) FIRST( ) = Αυτό επιτρέπει στον αναλυτή να προγνώσει με ασφάλεια την παραγωγή που θα χρησιμοποιεί σε κάθε βήμα!

Ανάλυση προβλέπουσας αναδρομικής κατάβασης VΙ Δοθείσης μιας γραμματικής που έχει την ιδιότητα LL(1) μπορούμε να γράψουμε διαδικασίες που να αναγνωρίζουν το αριστερό μέρος της κάθε παραγωγής ο κώδικας της ανάλυσης είναι απλός και γρήγορος Οι γραμματικές με την ιδιότητα LL(1) ονομάζονται προγνώσιμες γραμματικές γιατί ο αναλυτής μπορεί να «προγνώσει» τη σωστή ανάπτυξη σε κάθε σημείο της ανάλυσης. Οι αναλυτές που εκμεταλλεύονται την ιδιότητα LL(1) ονομάζονται αναλυτές πρόγνωσης. Μία περίπτωση ανάλυσης πρόγνωσης είναι η ανάλυση προβλέπουσας αναδρομικής κατάβασης.

Ανάλυση προβλέπουσας αναδρομικής κατάβασης VΙI Παράδειγμα διορθωμένης γραμματικής αριθμητικών εκφράσεων (βλ. διαφάνεια Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙΙ) int PLUS=1, MINUS=2,... int lookahead = getnexttoken(); //καθολική μετβλητή ΛΕΞ_ΜΟΝ void advance() { lookahead = getnexttoken(); } void match(int token) { if (lookahead == token) advance(); else error(); } void Term() { Factor(); TermPrime(); } void S() { Expr(); } void Expr() { Term(); ExprPrime(); } void ExprPrime() { switch(lookahead) { case PLUS : match(plus); Term(); ExprPrime(); break; case MINUS : match(minus); Term(); ExprPrime(); break; default: return; } } void TermPrime() { switch(lookahead) { case TIMES: match(times); Factor(); TermPrime(); break; case DIV: match(div); Factor(); TermPrime(); break; default: return;} } void Factor() { switch(lookahead) { case LPAR : match(lpar); Expr(); match(rpar); break; case NUMBER: match(number); break; default: error();} }

Ανάλυση προβλέπουσας αναδρομικής κατάβασης VΙII Παράδειγμα διορθωμένης γραμματικής αριθμητικών εκφράσεων (βλ. διαφάνεια Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙΙ) Για την κατασκευή παράγωγου δένδρου: Γράφουμε μέσα στις διαδικασίες κώδικα για δημιουργία κόμβου Περνάμε τους κόμβους από διαδικασία σε διαδικασία μέσω μιας στοίβας Αφαιρούμε από τη στοίβα τους κόμβους του δεξιού μέρους της παραγωγής, τους κάνουμε απογόνους του κόμβου του αριστερού μέρους και εισάγουμε τον τελευταίο στη στοίβα Για την κατασκευή συντακτικού δένδρου Κατασκευάζουμε λιγότερους κόμβους Χρειάζεται να τους βάζουμε στη στοίβα με την κατάλληλη σειρά ώστε να εξασφαλίζουμε αριστερή προσεταιριστικότητα Expr() { Term(); ExprPrime(); /* δημιουργία κόμβου Expr; εξαγωγή κόμβου ExprPrime από στοίβα; εξαγωγή κόμβου Term από στοίβα; καθιστούμε ExprPrime και Term απογόνους του Expr; εισαγωγή κόμβου Expr στη στοίβα; */ }

Ανάλυση προβλέπουσας αναδρομικής κατάβασης IΧ Άλλο παράδειγμα S = if E then S else S begin S L print E. L = end ; S L. E = num = num void S() { void L() { switch(lookahead) { switch(lookahead) { case IF: match(if); E(); match(then); S(); case END: match(end); break; match(else); S(); break; case SEMI: match(semi); S(); case BEGIN: matvh(begin); S(); L(); break; L(); break; case PRINT: match(print); E(); break; default: error(); default: error(); } } } } void E() { match(num); match(eq); match(num); }

Ανάλυση προβλέπουσας αναδρομικής κατάβασης Χ main: κλήση S(); S 1 : εφαρμογή της παραγωγής (S, IF) : S if E then S else S S 1 : match(if); S 1 : κλήση E(); E 1 : εφαρμογή της παραγωγής για (E, NUM): E num = num E 1 : match(num); match(eq); match(num); E 1 : return για E 1 στο S 1 S 1 : match(then); S 1 :κλήση S(); S 2 : εφαρμογή της παραγωγής για (S, PRINT): S print E S 2 : match(print); S 2 : κλήση E(); E 2 : εφαρμογή της παραγωγής για (E, NUM): E num = num E 2 : match(num); match(eq); match(num); E 2 : return για E 2 στο S 2 S 2 : return για S 2 στο S 1 S 1 : match(else); S 1 : κλήση S(); S 3 : εφαρμογή της παραγωγής για (S, PRINT): S print E S 3 : match(print); S 3 : κλήση E(); E 3 : εφαρμογή της παραγωγής για (E, NUM): E num = num E 3 : match(num); match(eq); match(num); E 3 : return για E 2 στο S 3 S 3 : return για S 3 στο S 1 S 1 : return για S 1 στο main main: match(eof); return success; Άλλο παράδειγμα (συνέχεια) πρόταση: if 2=2 then print 5=5 else print 1=1

Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙ Γενική μορφή διαδικασιών προβλέπουσας αναδρομικής κατάβασης Αν για το μη τερματικό σύμβολο Χ ορίζεται στη γραμματική ο κανόνας X p1 p2... και αν υποθέσουμε ότι η pείναι i απαλείψιμη, τότε Χ: Επέλεξε ΛΕΞ_ΜΟΝ περιπτώσεις FIRST( p 1 ): διαδικασίες αναγνώρισης p 1 περιπτώσεις FIRST( p 2 ): διαδικασίες αναγνώρισης p 2... περιπτώσεις FIRST( p i ) FOLLOW(X): p i διαδικασίες αναγνώρισης ή των συμβόλων που ακολουθούν αλλιώς λάθος; Τέλος Χ.

Recursive descent με σύνολα FIRST & Follow

Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧVΙΙ Δεν μπορούν να χρησιμοποιηθούν αριστερά αναδρομικές γραμματικές. Δεν μπορούν να χρησιμοποιηθούν γραμματικές, που δεν είναι LL(1), όπως π.χ.: σειρά_εντολών = εντολή ; σειρά_εντολών εντολή. εντολή = τερματικό.

Ανάλυση LL(1) I Συμβολοσειρά εισόδου κεφαλή ανάγνωσης Πίνακας ανάλυσης M[X, α] Αλγόριθμος X Y "k" στοίβα (σύμβολα που εκκρεμεί η αναγνώρισή τους)

Ανάλυση LL(1) II Αλγόριθμος υπολογισμού πίνακα ανάλυσης Μ

Ανάλυση LL(1) IIΙ ΠΑΡΑΔΕΙΓΜΑ (γραμματική αριθμητικών εκφράσεων) S = έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = + όρος υπ_όροι - όρος υπ_όροι ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = * παράγοντας υπ_παραγ / παράγοντας υπ_παραγ ε. παράγοντας = ( έκφραση ) αριθμός. M αριθμός + - * / ( ) $ έκφραση όρος υπ_όροι όρος υπ_όροι υπ_όροι + όρος υπ_όροι - όρος υπ_όροι ε ε όρος παράγοντας υπ_παραγ παράγοντας υπ_παραγ υπ_παραγ ε ε * παράγοντας υπ_παραγ / παράγοντας υπ_παραγ ε ε παράγοντας αριθμός ( έκφραση )

Ανάλυση LL(1) IV ΠΑΡΑΔΕΙΓΜΑ (γραμματική αριθμητικών εκφράσεων συνέχεια) LL(1) ανάλυση της συμβολοσειράς εισόδου 27-5*8 ΣΤΟΙΒΑ ΣΥΜΒΟΛ. ΠΑΡΑΓΩΓΗ $ έκφραση 27-5*8$ $ υπ_όροι όρος 27-5*8$ έκφραση = όρος υπ_όροι. $ υπ_όροι υπ_παραγ. παράγοντας 27-5*8$ όρος = παράγοντας υπ_παραγ. $ υπ_όροι υπ_παραγ. αριθμός 27-5*8$ παράγοντας = αριθμός. $ υπ_όροι υπ_παραγ. -5*8$ $ υπ_όροι -5*8$ υπ_παραγ. = ε. $ υπ_όροι όρος - -5*8$ υπ_όροι = - όρος υπ_όροι. $ υπ_όροι όρος 5*8$ $ υπ_όροι υπ_παραγ. παράγοντας 5*8$ όρος = παράγοντας υπ_παραγ. $ υπ_όροι υπ_παραγ. αριθμός 5*8$ παράγοντας = αριθμός. $ υπ_όροι υπ_παραγ. *8$ $ υπ_όροι υπ_παραγ. παράγοντας * *8$ υπ_παραγ. = * παράγοντας υπ_παραγ. $ υπ_όροι υπ_παραγ. παράγοντας 8$ $ υπ_όροι υπ_παραγ. αριθμός 8$ παράγοντας = αριθμός. $ υπ_όροι υπ_παραγ. $ $ υπ_όροι $ υπ_παραγ. = ε. $ $ υπ_όροι. = ε.

Ανάλυση LL(1) V Αλγόριθμος ανάλυσης LL(1) push($); // $ είναι το σύμβολο τέλους της συμβολοσειράς push(s); // S είναι η αρχή της γραμματικής lookahead = get_next_token(); // διάβασε το επόμενο αναγνωριστικό repeat X = top_of_stack(); if (X είναι τερματικό ή X == $) then if (X = = lookahead) then pop(x); lookahead = get_next_token(); else error(); else // X ένα μη τερματικό if ( M[X, lookahead] = = X Y 1 Y 2... Y k ) then pop(x); push(y k ); push(y k-1 );... push(y 1 ); else error(); until (X = $)

Αριστερή Αναδρομικότητα (left recursion) Ένας κανόνας είναι αριστερά αναδρομικός όταν το πρώτο σύμβολο που εμφανίζεται στο δεξί σκέλος είναι το μη τερματικό που εμφανίζεται και αριστερά π.χ. Α Αcd είναι αριστερά αναδρομικός Α c Αd δεν είναι αριστερά αναδρομικός Αντίστοιχη ρουτίνα αναδρομικού κανόνα: procedure A ; begin Α ; κάλεσμα της Α getoken(c) ; getoken(d) ; end ; 25

Εξάλειψη Αριστερής Αναδρομικότητας Τέχνασμα εξάλειψης Από: Α Αα β σε : Α βα' Α' αα' ε Γραμματική: Ε Ε + T Τ Τ Τ*F F F <id> ε Μετά την εξάλειψη έχουμε : Ε ΤΕ Ε + Τ Ε ε Τ FT T *F T ε F <id> ε 26

Απομάκρυνση αριστερής αναδρομικότητας Ι Διακρίνουμε την άμεση και την έμμεση αριστερή αναδρομικότητα ΠΑΡΑΔΕΙΓΜΑ ΑΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: έκφραση = έκφραση ΤΛ_ΑΘ όρος όρος. ΠΑΡΑΔΕΙΓΜΑ ΕΜΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: X Yp 2... Y Xp 1... ΓΕΝΙΚΗ ΜΟΡΦΗ ΑΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: X Xp1 Xp2... Xpn q1 q2... q m μετασχηματίζεται στην ισοδύναμη μορφή X X q1 X ' q2 X '... qm X '. ' 2 p1 X ' p X '... pn X '.

Απομάκρυνση αριστερής αναδρομικότητας ΙΙ ΠΑΡΑΔΕΙΓΜΑ Η S = έκφραση. έκφραση = έκφραση + όρος έκφραση όρος όρος. όρος = όρος * παράγοντας όρος / παράγοντας παράγοντας. παράγοντας = ( έκφραση ) αριθμός. μετασχηματίστηκε στην S=έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = + όρος υπ_όροι όρος υπ_όροι ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = * παράγοντας υπ_παραγ / παράγοντας υπ_παραγ ε. παράγοντας = ( έκφραση ) αριθμός.

Απομάκρυνση αριστερής αναδρομικότητας ΙΙΙ Αλγόριθμος απομάκρυνσης άμεσης και έμμεσης αριστερής αναδρομικότητας Είσοδος: Μία γραμματική G χωρίς κυκλικούς κανόνες παραγωγής και κανόνες-ε Έξοδος: Μία ισοδύναμη γραμματική χωρίς αριστερή αναδρομικότητα Περιγραφή: 1. Θεωρούμε τα μη τερματικά σύμβολα X 1, X 2,..., X n, με το δείκτη του καθενός να αντιστοιχεί στη σειρά με την οποία κάνει την εμφάνισή του ο αντίστοιχος κανόνας στη γραμματική. 2. Για (i:=1 μέχρι n) επανέλαβε Για (j:=1 μέχρι i-1) επανέλαβε αντικατέστησε κάθε κανόνα της μορφής X i X jq με τους κανόνες X i p1q p2q... pkq, για τις υπάρχουσες παραγωγές X j p1 p2... pk Τέλος επανάληψης απομάκρυνε την άμεση αριστερή αναδρομικότητα των κανόνων για το σύμβολο X i Τέλος επανάληψης

Απομάκρυνση αριστερής αναδρομικότητας ΙV Κατά την απομάκρυνση της αριστερής αναδρομικότητας δεν αλλάζει η γλώσσα της γραμματικής. Αλλάζει η μορφή των δένδρων που παράγει η επιλεγείσα μέθοδος ανάλυσης. Σημαντικότερη συνέπεια είναι το γεγονός ότι χάνεται η επιθυμητή ιδιότητα της αριστερής προσεταιριστικότητας.

Παραγοντοποίηση Σε γενική μορφή η παραγοντοποίηση συνίσταται στο να πάρουμε έναν κανόνα της μορφής: Α αβ 1 αβ 2 και να τον μετατρέψουμε σε: Α αβ Β β 1 β 2 Εφαρμόζοντας την παραγοντοποίηση, μετατρέπουμε τους κανόνεςέτσιώστεταπρώτατερματικάπουεμφανίζονταισε κάθε επιλογή του δεξιού σκέλους κάθε κανόνα να είναι όλα διαφορετικά μεταξύ τους. Ονομάζουμε αυτή την ιδιότητα ενός κανόνα «προβλεψιμότητα». 31

Παράδειγμα Παραγοντοποίησης E T E + T Τουλάχιστον ένα T πρέπει να υπάρχει ακολουθούμενο από τη συμβολοσειρά + T που μπορεί να επαναλαμβάνεται n φορές, όπου n = 0. Άρα μπορεί να παραγοντοποιηθεί και να γραφεί: E T ( + T )* (ή εναλλακτικά E T { + T } ) Το παραπάνω αποτελεί μια μορφή αριστερής αναδρομικότητας και λύνεται γενικά με την λεγόμενη «εξάλειψη αριστερής αναδρομικότητας». 32

Αριστερή παραγοντοποίηση Ι Προηγείται οποιασδήποτε προβλέπουσας ανάλυσης, αν για το ίδιο μη τερματικό σύνολο υπάρχουν δύο ή περισσότεροι κανόνες με το ίδιο πρόθεμα στο δεξί μέρος. ΠΑΡΑΔΕΙΓΜΑΤΑ σειρά_εντολών = εντολή ; σειρά_εντολών εντολή. εντολή = τερματικό. ή εντολή_if = if έκφραση then εντολή if έκφραση then εντολή else εντολή.

Αριστερή παραγοντοποίηση ΙΙ Γενικά, ο κανόνας X " y" p1 " y" p2. μετασχηματίζεται στον X " y" X '. X p 1 p. ' 2 Είσοδος: Μία γραμματική G Έξοδος: Μία ισοδύναμη γραμματική LL(1) Περιγραφή: Για (κάθε μη τερματικό σύμβολο X) επανέλαβε συμβολίζουμε με p το μεγαλύτερο κοινό πρόθεμα μεταξύ δύο ή περισσότερων εναλλακτικών περιπτώσεων παραγωγής του X αν ( p ) τότε Έστω X p1 p2... pn. όλες οι πιθανές παραγωγές για το μη τερματικό σύμβολο Χ και έστω ότι οι p 1, p2,..., pk μοιράζονται το κοινό πρόθεμα p, ώστε στις πιθανές παραγωγές X pq1 pq2... pqk pk 1... pn. τα q 1, q2,..., qk δε μοιράζονται κάποιο κοινό πρόθεμα, ενώ τα p k 1, p2,..., pn δε αρχίζουν από p. Αντικαθιστούμε κάθε τέτοιο κανόνα με δύο κανόνες της μορφής X px p k... p. τέλος αν Τέλος επανάληψης X ' q1... qk ' 1 n.

Αντικατάσταση Αντικαθιστούμε στο δεξί σκέλος ενός κανόνα παραγωγής ένα μη τερματικό Α με όλα τα εναλλακτικά μέλη κανόνων για το Α: Β a Α b A α 1 α 2 αn Μετασχηματίζεται σε: Β a α 1 b a α 2 b aαnb 35