Γιώργος Δημητρίου Ενότητα 1 η : Parsers
Συντακτική Ανάλυση για ΓΧΣ Οι τεχνικές συντακτικής ανάλυσης κατηγοριοποιούνται με βάση διάφορα κριτήρια: Κατεύθυνση ανάλυσης μη τερματικών συμβόλων Σειρά επιλογής μη τερματικών συμβόλων Ντετερμινισμός Κατεύθυνση εισόδου Κανονικές και μη κανονικές Γραμμικές και μη γραμμικές
Ανάλυση Συμβόλων Από πάνω προς τα κάτω (top-down) Ξεκινά με το αρχικό σύμβολο προβλέποντας διαδοχικά νέες ακολουθίες συμβόλων. Από κάτω προς τα πάνω (bottom-up) Αναγνωρίζει σταδιακά συμβολοσειρές και ελαττώνει μέχρι το αρχικό σύμβολο.
Επιλογή Μη Τερματικών Συμβόλων Κατά βάθος Δημιουργούμε το συντακτικό δέντρο καθ ύψος Κατά πλάτος Δημιουργούμε το συντακτικό δέντρο κατά πλάτος
Ντετερμινισμός Ντετερμινιστική ανάλυση Πιο γρήγορη, αλλά πολύ περιοριστική Μη ντετερμινιστική ανάλυση Γενικευμένη συντακτική ανάλυση Καλύπτει διφορούμενες γραμματικές, αλλά πιο αργή
Κατεύθυνση Εισόδου Κατευθυνόμενη ανάλυση Συνήθως από αριστερά προς τα δεξιά Μη κατευθυνόμενη ανάλυση Ιδανική για διαίρεση και παράλληλη υλοποίηση
Κανονική ανάλυση Κανονική ονομάζουμε την ανάλυση που ακολουθεί συγκεκριμένο αλγόριθμο Μη κανονική ονομάζουμε την ανάλυση που μπορεί να τροποποιείται ανάλογα με την είσοδο και τις επιλογές που έχει Αναβολή αναγνώρισης συμβόλου Έξυπνοι συντακτικοί αναλυτές
Πολυπλοκότητα ΣΑ Γραμμικοί είναι οι αναλυτές με γραμμική πολυπλοκότητα ως προς το μήκος n της εισόδου Απλά γραμμικοί έναντι πραγματικού χρόνου Μη γραμμικοί αναλυτές είναι αυτοί με εκθετική πολυπλοκότητα Γενικευμένοι: γραμμικοί με κάποια στοιχεία μη γραμμικής ανάλυσης κάθε φορά που η είσοδος προκαλεί μη ντετερμινισμό
Κατηγοριοποίηση ΣΑ Springer 2008
Συντακτική Ανάλυση και Πολλαπλασιασμός Δυαδικών Πινάκων Αποδεικνύεται ότι η γενική μη κατευθυνόμενη ΣΑ των ΓΧΣ ανάγεται σε πολλαπλασιασμό δυαδικών πινάκων (Boolean Matrix Multiplication) Πολυπλοκότητα 0(n 2,376 ) Όμως η αναγωγή είναι πολύπλοκη και χρονοβόρα, αξίζει για τεράστια είσοδο που πρέπει να είναι στη μνήμη
Αλγόριθμος Unger Από επάνω προς τα κάτω Δημιουργεί όλες τις δυνατές κατανομές των συμβόλων της πρότασης σε τόσες υποσυμβολοσειρές όσα είναι τα σύμβολα του δεξιού μέλους που αναλύεται Επαναλαμβάνει αναδρομικά όσο υπάρχει κατανομή και ταιριάζουν τα τερματικά σύμβολα Επιτυχία αν ταιριάξουν όλα τα σύμβολα Βελτιστοποίηση κατανομών
Παράδειγμα Έστω η γραμματική εκφράσεων: Expr Expr + Term Term Term Term Factor Factor Factor ( Expr ) i Για την πρόταση (i+i) i δημιουργούμε τους πίνακες: ή, μετά, μετά κοκ
Δυσκολίες Κανένας περιορισμός στις ΓΧΣ: Αν υπάρχει ε-παραγωγή, επιτρέπουμε στις κατανομές και μηδέν τερματικά σύμβολα ανά σύμβολο ανάλυσης Αν υπάρχει κύκλος στους κανόνες παραγωγής, τότε θέτουμε έλεγχο επανεμφάνισης της ίδιας συμβολοσειράς για το ίδιο μη τερματικό σύμβολο απορρίπτουμε τη συγκεκριμένη κατανομή
Αλγόριθμος Cocke-Younger-Kasami (CYK ή λιγότερο συχνά CKY) Από κάτω προς τα επάνω Δημιουργεί όλους τους συνδυασμούς συμβόλων δεξιού μέλους που δημιουργούνται πηγαίνοντας από συμβολοσειρές μήκους 1 έως συμβολοσειρές μήκους n Επιτυχία αν φτάσουμε σε μήκος n με το αρχικό σύμβολο της γραμματικής
Περιορισμοί Για να επιτυγχάνεται η επιθυμητή πολυπλοκότητα 0(n 3 ): Η γραμματική δεν πρέπει να έχει ε-παραγωγές Τα δεξιά μέλη των κανόνων δεν μπορούν να έχουν μόνο ένα μη τερματικό σύμβολο (unit rules) Εν τέλει η γραμματική πρέπει να είναι σε κανονική μορφή Chomsky (CNF) Αλλιώς η πολυπλοκότητα γίνεται 0(n 4 )
Παράδειγμα Γενικής ΓΧΣ 1 ο βήμα 2 ο βήμα 3 ο βήμα 4 ο βήμα
ΓΧΣ σε CNF Μια ΓΧΣ είναι σε κανονική μορφή Chomsky αν οι κανόνες της έχουν τη μορφή A a, A BC, a T B,C N δηλαδή να παράγουν είτε απλό τερματικό είτε διπλό μη τερματικό σύμβολο.
Μετατροπή σε CNF Για να μετατρέψουμε μια γενική ΓΧΣ σε CNF, πρέπει να: Απαλείψουμε τις ε-παραγωγές Απαλείψουμε τις παραγωγές απλού μη τερματικού συμβόλου Απαλείψουμε τις παραγωγές τερματικών δίπλα σε μη τερματικά σύμβολα Χωρίσουμε τις παραγωγές πολλαπλών μη τερματικών συμβόλων σε πολλές παραγωγές ακριβώς δύο συμβόλων Τι δέντρο θα πάρουμε τελικά; Τι κάνουμε για να επανέλθουμε στην αρχική ΓΧΣ;
Παράδειγμα Γραμματικής CNF Ισοδύναμη της προηγούμενης ΓΧΣ Εφαρμογή αλγόριθμου CYK σε μορφή πίνακα
Αλγόριθμος CYK function CYKparse (in buf[ ], out table[ ]) for j = 1 to n table[1, j] = {A A buf[j] G} for i = 2 to j J = j - i + 1 for k = 1 to i table[i, J] = table[i, J] {A A BC G, B table[k, J], C table[i - k, J + k]}
Αλγόριθμος Earley Από κάτω προς τα επάνω, αλλά και από επάνω προς τα κάτω, με επιλογή συμβόλων κατά πλάτος Μοιάζει με ΣΑ τύπου LR, αλλά ορίζει και την κίνηση συμπλήρωσης (completion) Η ελάττωση δεν επιστρέφει σε προηγούμενη κατάσταση, ώστε να μεταβεί σε άλλη, αλλά άμεσα συμπληρώνει την αναγνώριση του συμβόλου με άλλες πιθανές κινήσεις Δεν κατασκευάζονται εξ αρχής καταστάσεις, αλλά δουλεύει απ ευθείας στην είσοδο
Λειτουργία Αλγορίθμου Earley Με κάθε στοιχείο σημειώνουμε προπορευόμενα που βρίσκουμε όπως στο ΣΑ LR Επίσης σημειώνουμε ένα δείκτη στην είσοδο για το σύμβολο από το οποίο ξεκίνησε η παραγωγή Μεταβάσεις γίνονται μόνο με την είσοδο Σε μια ελάττωση κοιτάζουμε την κατάσταση που υποδεικνύεται και προσθέτουμε στοιχεία με αναγνωρισμένο το σύμβολο του αριστερού μέλους της ελάττωσης
Παράδειγμα Έστω η ΓΧΣ ΑΕ Με είσοδο a+a*a έχουμε:
Απόδοση Αλγόριθμου Earley Πολυπλοκότητα 0(n 3 ) για γενικές ΓΧΣ Πολυπλοκότητα 0(n 2 ) για μη διφορούμενες ΓΧΣ Πολυπλοκότητα 0(n) για τις περισσότερες μη διφορούμενες ΓΧΣ
Γενικευμένος ΣΑ τύπου LR (GLR) Κατασκευή πίνακα τύπου LR και εκτέλεση ΣΑ Σε κάθε σύγκρουση δημιουργούμε αντίγραφα της στοίβας και εξετάζουμε όλους τους νέους συνδυασμούς Σε περίπτωση αδυναμίας κίνησης, διαγράφουμε την τρέχουσα στοίβα και εξετάζουμε την επόμενη εναλλακτική Αν δεν υπάρχει άλλη στοίβα, έχουμε απόρριψη
Παράδειγμα Διφορούμενη ΓΧΣ: Λειτουργία αλγορίθμου: Καταστάσεις LR(0): GSS:
Δυσκολίες Κύκλοι μεταβάσεων χωρίς κατανάλωση εισόδου Συνεχή αντίγραφα στοίβας, αλλιώς σταματάμε την αντιγραφή μόλις δούμε την ίδια κατάσταση χωρίς να έχουμε κατάνάλωση εισόδου, δημιουργώντας κύκλο στο GSS
Παράδειγμα με κύκλο Διφορούμενη ΓΧΣ: Καταστάσεις LR(0): GSS:
Παράλληλος Αλγόριθμος Fischer Πολλαπλοί επιμέρους ΣΑ Χωρίζουμε αυθαίρετα την είσοδο σε τμήματα. Το πρώτο τμήμα ξεκινάει κανονικά με την αρχική κατάσταση Τα υπόλοιπα τμήματα ξεκινάνε με όλες τις καταστάσεις που δέχονται ολίσθηση με το πρώτο σύμβολο του τμήματος Οι ολισθήσεις γίνονται κανονικά Οι ελαττώσεις που μπορούν να γίνουν στην τοπική στοίβα γίνονται κανονικά Διαφορετικά περιμένουμε τον προηγούμενο ΣΑ
Παράδειγμα ΓΧΣ: Λειτουργία για είσοδο n-n-(n-n) : Πίνακας ΣΑ LR(0):
Άλλοι Παράλληλοι ΣΑ για ΓΧΣ GLR: Σε κάθε αντιγραφή στοίβας κάνε διακλάδωση σε άλλο επεξεργαστή Agent parsers: Ένας επεξεργαστής για κάθε σύμβολο εισόδου ή για κάθε κανόνα Parallel Earley: Όμοια λειτουργία με τον Fischer ΣΑ για Γραμματικές με Συμφραζόμενα?