Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεἈπφία Βάμβας Τροποποιήθηκε πριν 7 χρόνια
1
Κεφάλαιο 2 :: Σύνταξη των γλωσσών προγραμματισμού
Κεφάλαιο 2 :: Σύνταξη των γλωσσών προγραμματισμού Πραγματολογία των Γλωσσών Προγραμματισμού Michael L. Scott Copyright © 2005 Elsevier
2
Μια κανονική έκφραση είναι ένα από τα εξής:
Κανονικές Εκφράσεις Μια κανονική έκφραση είναι ένα από τα εξής: Ένας χαρακτήρας Η κενή συμβολοσειρά, που συμβολίζεται με Δύο κανονικές εκφράσεις η μια δίπλα στην άλλη Δυο κανονικές εκφράσεις διαχωρισμένες με μια κατακόρυφη γραμμή, | (“ή”) Μια κανονική έκφραση ακολουθούμενη από το άστρο του Kleene (συνένωση καμίας ή περισσότερων συμβολοσειρών) Copyright © 2005 Elsevier
3
Κανονικές Εκφράσεις Οι αριθμητικές σταθερές στην Pascal μπορούν να παραχθούν από τις εξής κανονικές εκφράσεις: Copyright © 2005 Elsevier
4
Γραμματικές χωρίς συμφραζόμενα
Η σημειογραφία των γραμματικών χωρίς συμφραζόμενα ονομάζεται συχνά μορφή Backus-Naur (Backus-Naur Form, BNF) Μια γραμματική χωρίς συμφραζόμενα αποτελείται από Ένα σύνολο τερματικών συμβόλων T Ένα σύνολο μη τερματικών συμβόλων N Ένα αρχικό σύμβολο S (μη τερματικό) Ένα σύνολο συντακτικών κανόνων Copyright © 2005 Elsevier
5
Γραμματικές χωρίς συμφραζόμενα
Γραμματική εκφράσεων με προτεραιότητα και προσεταιριστικότητα Copyright © 2005 Elsevier
6
Γραμματικές χωρίς συμφραζόμενα
Συντακτικό δένδρο για τη γραμματική των εκφράσεων (με προτεραιότητα) για το * 5 Copyright © 2005 Elsevier
7
Γραμματικές χωρίς συμφραζόμενα
Συντακτικό δένδρο για τη γραμματική των εκφράσεων (με αριστερή προσεταιριστικότητα) για το Copyright © 2005 Elsevier
8
Θυμηθείτε ότι η λεκτική ανάλυση
Λεκτική ανάλυση Θυμηθείτε ότι η λεκτική ανάλυση ομαδοποιεί τους χαρακτήρες εισόδου σε λεκτικές μονάδες αφαιρεί τα σχόλια (συνήθως) χειρίζεται τις οδηγίες (σημαντικά σχόλια) αποθηκεύει το κείμενο των αναγνωριστικών, των αριθμητικών σταθερών και των συμβολοσειρών αποθηκεύει τα σημεία του αρχικού κώδικα (αρχείο, γραμμή, στήλη) για την παραγωγή μηνυμάτων σφάλματος Copyright © 2005 Elsevier
9
Αν είναι . κοιτάζουμε τον επόμενο χαρακτήρα
Λεκτική ανάλυση Θεωρήστε ότι κατασκευάζουμε έναν αυτοσχέδιο λεκτικό αναλυτή για την Pascal: Διαβάζουμε τους χαρακτήρες έναν-έναν (διαβάζουμε μπροστά τον επόμενο χαρακτήρα όταν χρειάζεται) Αν είναι κάποια από τις λεκτικές μονάδες του ενός χαρακτήρα { ( ) [ ] < > , ; = + - κλπ } την επιστρέφουμε Αν είναι . κοιτάζουμε τον επόμενο χαρακτήρα Αν είναι . επιστρέφουμε .. Διαφορετικά επιστρέφουμε . και ξαναχρησιμοποιούμε την προανάγνωση Copyright © 2005 Elsevier
10
Αν είναι < κοιτάζουμε τον επόμενο χαρακτήρα
Λεκτική Ανάλυση Αν είναι < κοιτάζουμε τον επόμενο χαρακτήρα αν είναι = επιστρέφουμε <= διαφορετικά επιστρέφουμε < και ξαναχρησιμοποιούμε την προανάγνωση, κλπ. Αν είναι γράμμα διαβάζουμε οσαδήποτε επόμενα γράμματα, αριθμούς ή και “_” μέχρι να μην υπάρχει επόμενο στη συνέχεια ελέγχουμε αν είναι λέξη κλειδί Copyright © 2005 Elsevier
11
Λεκτική Ανάλυση Αν είναι ψηφίο, συνεχίζουμε την ανάγνωση μέχρι να βρούμε κάτι που δεν είναι ψηφίο αν δεν είναι . επιστρέφουμε μια ακέραια σταθερά διαφορετικά συνεχίζουμε να διαβάζουμε μια πραγματική σταθερά αν ο χαρακτήρας μετά το . δεν είναι ψηφίο επιστρέφουμε μια ακέραια σταθερά και ξαναχρησιμοποιούμε το . και την πρόγνωση Copyright © 2005 Elsevier
12
Λεκτική Ανάλυση Σχηματική αναπαράσταση ενός λεκτικού αναλυτή για την Pascal ως πεπερασμένου αυτομάτου Copyright © 2005 Elsevier
13
Είναι ένα Ντετερμινιστικό Πεπερασμένο Αυτόματο (ΝΠΑ)
Λεκτική Ανάλυση Είναι ένα Ντετερμινιστικό Πεπερασμένο Αυτόματο (ΝΠΑ) Τα εργαλεία lex, scangen, κλπ. τα παράγουν αυτόματα από ένα σύνολο κανονικών εκφράσεων Ειδικότερα, κατασκευάζουν μια μηχανή που αποδέχεται τη γλώσσα identifier | int const | real const | comment | symbol | ... Copyright © 2005 Elsevier
14
Λεκτική Ανάλυση Εκτελούμε συνεχώς τη μηχανή για να παράγουμε συνεχόμενες λεκτικές μονάδες Σχεδόν καθολικός κανόνας: πάντα διάβαζε τη μεγαλύτερη πιθανή λεκτική μονάδα από την είσοδο δηλαδή το foobar είναι foobar, ποτέ f ή foo ή foob ειδικότερα, το είναι πραγματική σταθερά και ποτέ 3, ., και 14159 Οι κανονικές εκφράσεις “παράγουν” μια κανονική γλώσσα· τα ΝΠΑ την “αναγνωρίζουν” Copyright © 2005 Elsevier
15
Οι λεκτικοί αναλυτές συνήθως κατασκευάζονται με τρείς τρόπους
Λεκτική Ανάλυση Οι λεκτικοί αναλυτές συνήθως κατασκευάζονται με τρείς τρόπους αυτοσχέδιοι ημι-αυτόματα αμιγή ΝΠΑ (συνήθως υλοποιημένα με ένθετες εντολές case) ΝΠΑ που κάνουν χρήση πινάκων Οι αυτοσχέδιοι είναι πιο γρήγοροι και μικροί σε μέγεθος κώδικα και με ειδικές λειτουργίες· όμως, καλοί λεκτικοί αναλυτές που έχουν παραχθεί αυτόματα τους πλησιάζουν Copyright © 2005 Elsevier
16
Το lex και το scangen παράγουν ΝΠΑ με πίνακες
Λεκτική Ανάλυση Η συγγραφή ενός αγνού ΝΠΑ σαν ένα σύνολο ένθετων εντολών case είναι μια πραγματικά χρήσιμη προγραμματιστική τεχνική αν και συνήθως είναι ευκολότερο να χρησιμοποιείτε perl, awk, sed για λεπτομέρειες δείτε την εικόνα 2.11 Το lex και το scangen παράγουν ΝΠΑ με πίνακες το lex (flex) σε κώδικα C το scangen σε μορφή αριθμητικών πινάκων και μιας ξεχωριστής συνάρτησης-οδηγού (για λεπτομέρειες δείτε την εικόνα 2.12) Copyright © 2005 Elsevier
17
Λεκτική Ανάλυση Ο κανόνας για τις λεκτικές μονάδες μέγιστου μήκους σημαίνει ότι επιστρέφετε μόνο όταν ο επόμενος χαρακτήρας δε μπορεί να χρησιμοποιηθεί για να συνεχίσει την τρέχουσα λεκτική μονάδα γενικά ο επόμενος χαρακτήρας πρέπει να αποθηκεύεται για την επόμενη λεκτική μονάδα Σε μερικές περιπτώσεις, ίσως χρειαστεί να κοιτάξετε παραπάνω από έναν χαρακτήρες μπροστά για να δείτε αν θα συνεχίσετε Στην Pascal, για παράδειγμα, όταν έχετε ένα 3 και βλέπετε μια τελεία συνεχίζετε (ελπίζοντας να διαβάσετε 3.14); ή σταματάτε (για να μη διαβάσετε 3..5); Copyright © 2005 Elsevier
18
DO 5 I = 1,25 loop DO 5 I = 1.25 assignment
Λεκτική Ανάλυση Σε πιο δύσκολες καταστάσεις, ίσως να μην αρκεί ένα συγκεκριμένο μήκος προανάγνωσης. Για παράδειγμα στην Fortran, έχουμε DO 5 I = 1,25 loop DO 5 I = 1.25 assignment Εδώ χρειάζεται να θυμόμαστε πότε είμαστε σε μια δυνητικά τελική κατάσταση και να αποθηκεύουμε πληροφορίες στις οποίες να μπορούμε να επιστρέψουμε αν κάποια στιγμή δε μπορέσουμε να προχωρήσουμε άλλο Copyright © 2005 Elsevier
19
Ορολογία: Συντακτική Ανάλυση
γραμματική χωρίς συμφραζόμενα (context-free grammar, CFG) σύμβολα τερματικά (λεκτικές μονάδες) μη-τερματικά συντακτικός κανόνας παραγωγές (αριστερότερες και δεξιότερες - κανονικές) δένδρα συντακτικής δομής προτασιακή μορφή Copyright © 2005 Elsevier
20
Υπάρχει άπειρο πλήθος γραμματικών για κάθε γλώσσα χωρίς συμφραζόμενα
Συντακτική Ανάλυση Κατ’ αναλογία με τις κανονικές εκφράσεις και τα ΝΠΑ, μια γραμματική χωρίς συμφραζόμενα (CFG) είναι μια γεννήτρια για μια γλώσσα χωρίς συμφραζόμενα (context-free language, CFL) ο συντακτικός αναλυτής είναι ο αναγνωριστής αυτής της γλώσσας Υπάρχει άπειρο πλήθος γραμματικών για κάθε γλώσσα χωρίς συμφραζόμενα δεν είναι όμως όλες οι γραμματικές ίδιες Copyright © 2005 Elsevier
21
Υπάρχουν δύο πολύ γνωστοί αλγόριθμοι συντακτικής ανάλυσης για αυτό
Συντακτική Ανάλυση Αποδεικνύεται ότι για κάθε CFG μπορούμε να κατασκευάσουμε ένα συντακτικό αναλυτή που να τρέχει σε χρόνο O(n3) Υπάρχουν δύο πολύ γνωστοί αλγόριθμοι συντακτικής ανάλυσης για αυτό Ο αλγόριθμος του Early Ο αλγόριθμος των Cooke-Younger-Kasami (CYK) Ο χρόνος O(n3) δεν είναι αποδεκτός για χρήση σε ένα μεταγλωττιστή – πολύ αργός Copyright © 2005 Elsevier
22
Συντακτική Ανάλυση Ευτυχώς υπάρχουν μεγάλες κλάσεις γραμματικών για τις οποίες μπορούμε να κατασκευάσουμε συντακτικούς αναλυτές που εκτελούνται σε γραμμικό χρόνο Οι δύο σημαντικότερες από αυτές τις κλάσεις είναι η LL και η LR LL σημαίνει “αριστερά προς τα δεξιά, αριστερότερη παραγωγή” (Left-to-right, Leftmost derivation). LR σημαίνει “αριστερά προς τα δεξιά, δεξιότερη παραγωγή” (Left-to-right, Rightmost derivation). Copyright © 2005 Elsevier
23
Υπάρχουν πολλές σημαντικές υποκλάσεις συντακτικών αναλυτών LR
Συντακτική Ανάλυση Οι συντακτικοί αναλυτές LL ονομάζονται επίσης “καθοδικοί” ή συντακτικοί αναλυτές “πρόβλεψης” και οι συντακτικοί αναλυτές LR ονομάζονται “ανοδικοί” ή συνθετικοί συντακτικοί αναλυτές Υπάρχουν πολλές σημαντικές υποκλάσεις συντακτικών αναλυτών LR SLR LALR Δε θα ασχοληθούμε με τις λεπτομέρειες σχετικά με τις διαφορές μεταξύ τους Copyright © 2005 Elsevier
24
Συντακτική Ανάλυση Κάθε γραμματική LL(1) είναι και LR(1), αν και η δεξιά αναδρομή στον συντακτικό κανόνα τείνει να χρειάζεται πολύ μεγάλες στοίβες και δυσχεραίνει τη σημασιολογική ανάλυση Κάθε CFL που μπορεί να αναλυθεί συντακτικά με ντετερμινιστικό τρόπο έχει μια γραμματική SLR(1) (που είναι LR(1)) Κάθε ντετερμινιστική CFL με την ιδιότητα προθέματος (μια έγκυρη συμβολοσειρά δε μπορεί να είναι πρόθεμα άλλης έγκυρης συμβολοσειράς) έχει μια γραμματική LR(0) Copyright © 2005 Elsevier
25
Συντακτική Ανάλυση Συνήθως βλέπετε τον όρο LL ή LR (ή άλλους) γραμμένο με έναν αριθμό σε παρενθέσεις μετά από αυτόν Ο αριθμός δείχνει πόσες λεκτικές μονάδες προανάγνωσης χρειάζονται για τη συντακτική ανάλυση Σχεδόν όλοι οι πραγματικοί μεταγλωττιστές χρησιμοποιούν προανάγωση μιας λεκτικής μονάδας Η γραμματική των εκφράσεων (με προτεραιότητα και προσεταιριστικότητα) που είδατε πριν είναι LR(1), αλλά όχι LL(1) Copyright © 2005 Elsevier
26
Μια γραμματική LL(1) (Εικόνα 2.15):
program stmt_list $$$ stmt_list stmt stmt_list | stmt id := expr | read id | write expr expr term term_tail term_tail add op term term_tail Copyright © 2005 Elsevier
27
Μια γραμματική LL(1) (συνέχεια)
10. term factor fact_tail 11. fact_tail mult_op fact fact_tail | factor ( expr ) | id | number add_op + | - mult_op * | / Copyright © 2005 Elsevier
28
Πώς αναλύουμε συντακτικά μια συμβολοσειρά με αυτήν τη γραμματική;
Συντακτική Ανάλυση LL Όπως η ανοδική γραμματική, μπορεί να εκφράσει την προσεταιριστικότητα και την προτεραιότητα αλλά πολλοί άνθρωποι δεν τη βρίσκουν εύχρηστη οι τελεστέοι ενός τελεστή δεν είναι μαζί στο δεξιό μέλος! όμως η απλότητα του αλγόριθμου συντακτικής ανάλυσης μας αποζημιώνει για αυτό το μειονέκτημα Πώς αναλύουμε συντακτικά μια συμβολοσειρά με αυτήν τη γραμματική; σταδιακά χτίζοντας το δένδρο συντακτικής ανάλυσης Copyright © 2005 Elsevier
29
Παράδειγμα (πρόγραμμα μέσου όρου) read A read B sum := A + B write sum
Συντακτική Ανάλυση LL Παράδειγμα (πρόγραμμα μέσου όρου) read A read B sum := A + B write sum write sum / 2 Αρχίζουμε στο πάνω μέρος και προβλέπουμε τους συντακτικούς κανόνες που θα χρειαστούμε με βάση το τρέχον αριστερότερο μη-τερματικό στο δένδρο και το τρέχον λεκτικό εισόδου Copyright © 2005 Elsevier
30
Δένδρο συντακτικής δομής για το πρόγραμμα μέσου όρου (Εικόνα 2.17)
Συντακτική Ανάλυση LL Δένδρο συντακτικής δομής για το πρόγραμμα μέσου όρου (Εικόνα 2.17) Copyright © 2005 Elsevier
31
Συντακτική Ανάλυση LL Συντακτική ανάλυση LL με χρήση πίνακα: έχετε ένα μεγάλο βρόχο που επαναλαμβανόμενα αναζητά μια ενέργεια σε ένα διδιάστατο πίνακα με βάση το τρέχον αριστερότερο μη-τερματικό και την τρέχουσα λεκτική μονάδα εισόδου. Οι ενέργειες είναι (1) ταύτιση με τερματικό (2) πρόβλεψη συντακτικού κανόνα (3) παραγωγή ενός σφάλματος σύνταξης Copyright © 2005 Elsevier
32
Πίνακας συντακτικής ανάλυσης LL(1) για τη γλώσσα της αριθμομηχανής
Copyright © 2005 Elsevier
33
Συντακτική Ανάλυση LL Για το χειρισμό του αριστερότερου μη-τερματικού, τοποθετείτε σε μια στοίβα τα άγνωστα τμήματα (που δεν έχετε δει ακόμα) των συντακτικών κανόνων για λεπτομέρειες δείτε την Εικόνα 2.20 Η βασική αρχή που πρέπει να θυμάστε είναι ότι η στοίβα περιέχει οτιδήποτε περιμένετε να δείτε από τώρα ως το τέλος του προγράμματος θα δείτε ό,τι προβλέπετε Copyright © 2005 Elsevier
34
Συντακτική Ανάλυση LL Προβλήματα που προκύπτουν όταν προσπαθούμε να κάνουμε μια γραμματική LL(1) αριστερή αναδρομή παράδειγμα: id_list id | id_list , id ισοδύναμα id_list id id_list_tail id_list_tail , id id_list_tail | epsilon μπορούμε να απαλλαγούμε από όλες τις αριστερές αναδρομές με μηχανικό τρόπο σε οποιαδήποτε γραμματική Copyright © 2005 Elsevier
35
Συντακτική Ανάλυση LL Προβλήματα που προκύπτουν όταν προσπαθούμε να κάνουμε μια γραμματική LL(1) κοινά προθέματα: άλλο ένα πράγμα που οι συντακτικοί αναλυτές LL δε μπορούν να χειριστούν επιλύεται με “αριστερή παραγοντοποίηση” παράδειγμα: stmt id := expr | id ( arg_list ) ισοδύναμα stmt id id_stmt_tail id_stmt_tail := expr | ( arg_list) μπορούμε να απαλείψουμε την αριστερή παραγοντοποίηση με μηχανικό τρόπο Copyright © 2005 Elsevier
36
Συντακτική Ανάλυση LL Η απαλοιφή της αριστερής αναδρομής και των κοινών προθεμάτων ΔΕΝ κάνει μια γραμματική LL υπάρχουν άπειρες μη-LL ΓΛΩΣΣΕΣ, και οι μηχανικοί μετασχηματισμοί δουλεύουν σε αυτές κανονικά τις λίγες γλώσσες που εμφανίζονται στην πράξη όμως, μπορούμε να τις χειριστούμε με ευρετικούς κανόνες Copyright © 2005 Elsevier
37
Συντακτική Ανάλυση LL Προβλήματα που προκύπτουν όταν προσπαθούμε να κάνουμε μια γραμματική LL(1) το πρόβλημα του “αιωρούμενου else” δεν επιτρέπει σε γραμματικές να είναι LL(1) (ή γενικότερα LL(k) για κάθε k) το ακόλουθο απόσπασμα φυσικής γραμματικής είναι διφορούμενο (Pascal) stmt if cond then_clause else_clause | other_stuff then_clause then stmt else_clause else stmt | epsilon Copyright © 2005 Elsevier
38
Συντακτική Ανάλυση LL Το λιγότερο φυσικό απόσπασμα γραμματικής μπορεί να αναλυθεί συντακτικά ανοδικά αλλά όχι καθοδικά stmt balanced_stmt | unbalanced_stmt balanced_stmt if cond then balanced_stmt else balanced_stmt | other_stuff unbalanced_stmt if cond then stmt | if cond then balanced_stmt else unbalanced_stmt Copyright © 2005 Elsevier
39
Συντακτική Ανάλυση LL Η συνήθης προσέγγιση, είτε ανοδική είτε καθοδική, είναι να χρησιμοποιούμε τη διφορούμενη γραμματική μαζί με έναν κανόνα αποφυγής αμφισημίας που να λέει το else ταιριάζει με το πλησιέστερο then ή γενικότερα, ο πρώτος από δύο πιθανούς συντακτικούς κανόνες είναι αυτός που θα προβλεφθεί (ή θα ελαττωθεί) Copyright © 2005 Elsevier
40
Στη Modula-2, για παράδειγμα, μπορείτε να πείτε:
Συντακτική Ανάλυση LL Ακόμα καλύτερα, οι γλώσσες (από την Pascal και έπειτα) γενικά χρησιμοποιούν ρητά σύμβολα τερματισμού, που λύνουν το πρόβλημα Στη Modula-2, για παράδειγμα, μπορείτε να πείτε: if A = B then if C = D then E := F end else G := H end Η Ada λέει “end if”, άλλες γλώσσες λένε “fi” Copyright © 2005 Elsevier
41
Με σύμβολα τερματισμού αυτό γίνεται
Συντακτική Ανάλυση LL Ένα πρόβλημα με τα σύμβολα τερματισμού είναι ότι έχουν την τάση να συσσωρεύονται. Στην Pascal λέμε if A = B then … else if A = C then … else if A = D then … else if A = E then … else ...; Με σύμβολα τερματισμού αυτό γίνεται if A = B then … else if A = C then … else if A = D then … else if A = E then … else ...; end; end; end; end; Copyright © 2005 Elsevier
42
Αποτελείται από 3 φάσεις:
Συντακτική Ανάλυση LL Ο αλγόριθμος για την κατασκευή συνόλων πρόβλεψης είναι πολύπλοκος (για μια γραμματική “πραγματικού” μεγέθους), αλλά σχετικά απλός Αποτελείται από 3 φάσεις: (1) υπολογισμός των συνόλων FIRST για τα σύμβολα (2) υπολογισμός των συνόλων FOLLOW για τα μη-τερματικά (αυτό απαιτεί τον υπολογισμό των συνόλων FIRST κάποιων συμβολοσειρών) (3) υπολογισμός των συνόλων πρόβλεψης ή του πίνακα για όλους τους συντακτικούς κανόνες Copyright © 2005 Elsevier
43
Είναι σύνηθες στις γραμματικές να χρησιμοποιούμε
Συντακτική Ανάλυση LL Είναι σύνηθες στις γραμματικές να χρησιμοποιούμε μικρά γράμματα κοντά στην αρχή του αλφαβήτου για τερματικά μικρά γράμματα κοντά στο τέλος του αλφαβήτου για συμβολοσειρές από τερματικά κεφαλαία γράμματα στην αρχή του αλφαβήτου για μη-τερματικά κεφαλαία γράμματα στο τέλος του αλφαβήτου για αυθαίρετα σύμβολα ελληνικά γράμματα για αυθαίρετες συμβολοσειρές συμβόλων Copyright © 2005 Elsevier
44
Αλγόριθμοι First/Follow/Predict:
FIRST() == {a : * a } (if =>* THEN {} ELSE NULL) FOLLOW(A) == {a : S + A a } (if S * A THEN {} ELSE NULL) Predict (A X1 ... Xm) == (FIRST (X1 ... Xm) - {}) (if X1, ..., Xm * then FOLLOW (A) ELSE NULL) Ακολουθούν λεπτομέρειες… Copyright © 2005 Elsevier
45
Συντακτική Ανάλυση LL Copyright © 2005 Elsevier
46
Συντακτική Ανάλυση LL Copyright © 2005 Elsevier
47
Μια διένεξη μπορεί να συμβεί όταν
Συντακτική Ανάλυση LL Αν κάποια λεκτική μονάδα ανήκει στο σύνολο πρόβλεψης περισσότερων του ενός συντακτικών κανόνων με το ίδιο αριστερό μέλος, τότε η γραμματική δεν είναι LL(1) Μια διένεξη μπορεί να συμβεί όταν η ίδια λεκτική μονάδα μπορεί να αρχίζει με περισσότερα του ενός αριστερά μέρη μπορεί να αρχίζει ένα δεξιό μέλος και ταυτόχρονα να εμφανίζεται μετά το αριστερό μέλος σε κάποιο έγκυρο πρόγραμμα και ένα πιθανό δεξιό μέλος να είναι το Copyright © 2005 Elsevier
48
Οι συντακτικοί αναλυτές LR συνήθως λειτουργούν με πίνακες:
ομοιότητα με ένα συντακτικό αναλυτή LL με πίνακες: ένας συντακτικός αναλυτής LR χρησιμοποιεί ένα μεγάλο βρόχο που επαναλαμβανόμενα ελέγχει ένα διδιάστατο πίνακα για να βρει την επόμενη ενέργεια διαφορά με ένα συντακτικό αναλυτή LL: ο οδηγός LR έχει μη-τετριμμένη κατάσταση (σαν ΝΠΑ), και ο πίνακας δεικτοδοτείται από την τρέχουσα λεκτική μονάδα εισόδου και την τρέχουσα κατάσταση η στοίβα περιέχει μια εγγραφή με ό,τι έχει δει ΜΕΧΡΙ ΣΤΙΓΜΗΣ (ΟΧΙ ό,τι περιμένει ακόμα να δει στην είσοδο) Copyright © 2005 Elsevier
49
Ένας συντακτικός αναλυτής είναι ένα ΝΠΑ
Συντακτική Ανάλυση LR Ένας συντακτικός αναλυτής είναι ένα ΝΠΑ μπορεί να οριστεί από ένα διάγραμμα καταστάσεων Ένας συντακτικός αναλυτής LL ή LR είναι ένα ΑΣ Οι αλγόριθμοι των Early και CYK ΔΕΝ χρησιμοποιούν ΑΣ ένα ΑΣ μπορεί να οριστεί με ένα διάγραμμα καταστάσεων και μια στοίβα το διάγραμμα καταστάσεων μοιάζει με ένα διάγραμμα καταστάσεων ΝΠΑ αλλά οι ακμές του έχουν ετικέτες-ζεύγη της μορφής <σύμβολο εισόδου, πάνω σύμβολο στη στοίβα> και, εκτός της μετακίνησης σε νέα κατάσταση, το ΑΣ μπορεί να τοποθετεί ή να αποκτά ένα πεπερασμένο σύνολο συμβόλων προς/από τη στοίβα Copyright © 2005 Elsevier
50
Ένα LL(1) ΑΣ έχει μόνο μια κατάσταση!
Συντακτική Ανάλυση LR Ένα LL(1) ΑΣ έχει μόνο μια κατάσταση! στην πραγματικότητα έχει δύο· απλά χρειάζεται μια δεύτερη για να αποδέχεται (είναι πολύ εύκολο) όλες οι ακμές είναι κλειστοί βρόχοι· η μόνη διαφορά μεταξύ τους είναι η επιλογή μεταξύ της ανάγνωσης από τη στοίβα και της εγγραφής σε αυτήν η τελική κατάσταση είναι προσβάσιμη από μια μετάβαση που βλέπει το τέλος αρχείου (EOF) στην είσοδο και στη στοίβα Copyright © 2005 Elsevier
51
Ένα SLR/LALR/LR ΑΣ έχει πολλαπλές καταστάσεις
είναι ένας “αναγνωριστής”, δεν “προβλέπει” δημιουργεί ένα δένδρο συντακτικής ανάλυσης ανοδικά οι καταστάσεις εντοπίζουν τους συντακτικούς κανόνες στους όποιους υπάρχει πιθανότητα να βρισκόμαστε Η συντακτική ανάλυση της Χαρακτηριστικής Μηχανής Πεπερασμένων Καταστάσεων βασίζεται στις εξής τεχνικές Ολίσθηση Ελάττωση Copyright © 2005 Elsevier
52
Συντακτκή Ανάλυση LR Για την απεικόνιση της συντακτικής ανάλυσης LR, θεωρήστε τη γραμματική (Εικόνα 2.24, Σελίδα 73): program stmt list $$$ stmt_list stmt_list stmt | stmt stmt id := expr | read id | write expr expr term | expr add op term Copyright © 2005 Elsevier
53
Γραμματική LR (συνέχεια):
9. term factor | term mult_op factor factor ( expr ) | id | number add op + | - mult op * | / Copyright © 2005 Elsevier
54
Συντακτική Ανάλυση LR Αυτή η γραμματική είναι SLR(1), μια αρκετά χρήσιμη κλάση ανοδικών γραμματικών δεν είναι αυτό ακριβώς που είχαμε δει έχουμε απαλείψει τον συντακτικό κανόνα έψιλον για να απλοποιήσουμε την παρουσίαση Για λεπτομέρειες σχετικά με τη συντακτική SLR(1) ανάλυση με πίνακα δείτε τις έπόμενες διαφάνειες Copyright © 2005 Elsevier
55
Συντακτική Ανάλυση LR Copyright © 2005 Elsevier
56
Συντακτική Ανάλυση LR Εικόνα 2.26: Σχηματική αναπαράσταση της ΧΜΠΚ της εικόνας Τα ονόματα των συμβόλων έχουν συντμηθεί για λόγους διάταξης. Οι ενέργειες ελάττωσης δεν παρουσιάζονται. Copyright © 2005 Elsevier
57
Συντακτική Ανάλυση LR Copyright © 2005 Elsevier
58
Συντακτική Ανάλυση LR Η συντακτική ανάλυση SLR βασίζεται σε Ολίσθηση
Ελάττωση και επίσης Ολίσθηση & Ελάττωση (για βελτιστοποίηση) Copyright © 2005 Elsevier
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.