+ All Categories
Home > Documents > Bottom Up Latex

Bottom Up Latex

Date post: 03-Oct-2014
Category:
Upload: antonis-koursoumis
View: 100 times
Download: 2 times
Share this document with a friend
Popular Tags:
19
Συντακτική Ανάλυση από Κάτω προς τα Πάνω BoĴom Up Parsing Αντώνης Κουρσούµης 7 Ιουνίου 2011 1 Εισαγωγή Αυτή η εργασία χωρίζεται σε τρία τµήµατα. Στο πρώτο τµήµα γίνεται ανάλυση της έννοιας του Συντακτικού Αναλυτή και των λειτουργιών του. Στο δεύτερο τµήµα αναλύεται η λειτουργία της από Κάτω προς τα Πάνω συντακτικής ανάλυσης. Στο τελευταίο τµήµα παρουσιάζονται τα σφάλµατα της παραπάνω διαδικασίας και τρόποι ανάνηψης από αυτά. 2 Ο Συντακτικός Αναλυτής Κατά τη συντακτική ανάλυση διαβάζονται οι λεκτοκές µονάδες και οµαδοποιούνται σε συντακτικές µονάδες βάσει γραµµατικής περιγράφοντας τη σύνταξη της αρχικής γλώσ- σας. Στο τέλος της φάσης έχει σχηµατισθεί ένα δέντρο που απεικονίζει τη συντακτική δοµή του αρχικού προγράµµατος. Το δέντρο αυτό ονοµάζεται συντακτικό δέντρο (syntax tree). Κατά τη διάρκεια της συντακτικής ανάλυσης, ορισµένες από τις λεκτικές µονάδες το- ποθετούνται στον πίνακα συµβόλων. Ο πίνακας αυτός συγκεντρώνει συνήθως πληροφο- ρίες για τα αναγνωριστικά που ορίζονται σε ένα πρόγραµµα, π.χ. τον τύπο και την εµ- βέλεια των µεταβλητών, το µέγεθος και τον αριθµό τον τύπο των παραµέτρων των υπο- προγραµµάτων κ.λ.π. Συνεργάζεται µε τις επόµενες φάσεις της µεταγλώττισης που χρη- σιµοποιούν αυτές τις πληροφορίες. Η διαχείριση του πίνακα συµβόλων, δεν αποτελεί ξε- χωριστή φάση της µεταγλώττισης αλλά κατέχει εξέχουσα θέση στην σχεδίαση ενός µε- ταγλωττιστή και επηρεάζει σηµαντικά στην πράξη την απόδοση του µεταγλωττιστή. Το τµήµα του µεταγλωττιστή που κάνει αυτή τη δουλειά ονοµάζεται συντακτικός αναλυτής (syntactic analyser, parser). Πιο συγκεκριµένα: Μια γραµµατική δίνει µία ακριβής, και έυκολη να κατανοηθεί, συντακτική προδιαγραφή µίας γλώσσας προγραµµατισµού. Από συγκεκριµένες κλάσεις γραµµατικών µπορούµε αυτόµατα να κατασκευάσουµε έναν αποτελεσµατικό συντακτικό αναλυτή που καθορίζει αν ο πηγαίος κώδικας είναι συ- ντακτικά σωστός. Επιπροσθέτως, η διαδικασία κατασκευής του αναλυτή µπορεί να αποκα- λύψει συντακτικές ασάφιες και άλλα κατασκευάσµατα που είναι δύσκολο να αναλυθούν που υπό άλλες περιπτώσεις θα περνούσαν απαρατήρητα στην αρχική φάση δηµιουργίας της γλώσσας και του µεταγλωττιστή της. 1
Transcript
Page 1: Bottom Up Latex

Συντακτική Ανάλυση από Κάτω προς τα ΠάνωBo om Up Parsing

Αντώνης Κουρσούµης

7 Ιουνίου 2011

1 Εισαγωγή

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

2 Ο Συντακτικός Αναλυτής

Κατά τη συντακτική ανάλυση διαβάζονται οι λεκτοκές µονάδες και οµαδοποιούνται σεσυντακτικές µονάδες βάσει γραµµατικής περιγράφοντας τη σύνταξη της αρχικής γλώσ-σας. Στο τέλος τηςφάσης έχει σχηµατισθεί ένα δέντροπουαπεικονίζει τη συντακτική δοµήτου αρχικού προγράµµατος. Το δέντρο αυτό ονοµάζεται συντακτικό δέντρο (syntax tree).

Κατά τη διάρκεια της συντακτικής ανάλυσης, ορισµένες από τις λεκτικές µονάδες το-ποθετούνται στον πίνακα συµβόλων. Ο πίνακας αυτός συγκεντρώνει συνήθως πληροφο-ρίες για τα αναγνωριστικά που ορίζονται σε ένα πρόγραµµα, π.χ. τον τύπο και την εµ-βέλεια των µεταβλητών, το µέγεθος και τον αριθµό τον τύπο των παραµέτρων των υπο-προγραµµάτων κ.λ.π. Συνεργάζεται µε τις επόµενες φάσεις της µεταγλώττισης που χρη-σιµοποιούν αυτές τις πληροφορίες. Η διαχείριση του πίνακα συµβόλων, δεν αποτελεί ξε-χωριστή φάση της µεταγλώττισης αλλά κατέχει εξέχουσα θέση στην σχεδίαση ενός µε-ταγλωττιστή και επηρεάζει σηµαντικά στην πράξη την απόδοση του µεταγλωττιστή. Τοτµήµα του µεταγλωττιστή που κάνει αυτή τη δουλειά ονοµάζεται συντακτικός αναλυτής(syntactic analyser, parser).

Πιο συγκεκριµένα:

•Μιαγραµµατική δίνει µίαακριβής, και έυκοληνακατανοηθεί, συντακτικήπροδιαγραφήµίας γλώσσας προγραµµατισµού.

• Από συγκεκριµένες κλάσεις γραµµατικών µπορούµε αυτόµατα να κατασκευάσουµεέναν αποτελεσµατικό συντακτικό αναλυτή που καθορίζει αν ο πηγαίος κώδικας είναι συ-ντακτικά σωστός. Επιπροσθέτως, η διαδικασία κατασκευής του αναλυτή µπορεί να αποκα-λύψει συντακτικές ασάφιες και άλλα κατασκευάσµατα που είναι δύσκολο να αναλυθούνπου υπό άλλες περιπτώσεις θα περνούσαν απαρατήρητα στην αρχική φάση δηµιουργίαςτης γλώσσας και του µεταγλωττιστή της.

1

Page 2: Bottom Up Latex

• Μία καλά σχεδιασµένη γραµµατική περιέχει µία δοµή γλώσσας προγραµµατισµούπου είναι χρήσιµη στην µετάφραση του πηγαίου κώδικα σε κώδικα αντικειµένων και τηνανίχνευση λαθών. Υπάρχουν διαθέσιµα εργαλεία για την µετατροπή µεταφράσεων περι-γραφών βασισµένων σε γραµµατικές, σε λειτουργικά προγράµµατα.

•Οι γλώσσες εξελίσσονται µε το χρόνο, αποκτώντας καινούργιες κατασκευές και πραγ-µατοποιώντας επιπλέον λειτουργίες. Αυτές οι νέες κατασκευές µπορούν να προστεθούνσε µία γλώσσα πιο εύκολα όταν αυτή είναι βασισµένη σε µία συγκεκριµένη γραµµατικήπεριγραφή.

Ο ρόλος του αναλυτή

Στο µοντέλο µεταγλώττισης που χρησιµοποιούµε, ο αναλυτής παίρνει ένα string απόλεκτικές µονάδες από τον λεκτικό αναλυτή και επαληθεύει ότι το string µπορεί να προκύ-ψει από την γραµµατική της γλώσσας στην οποία αναφέρεται. Περιµένουµε ο αναλυτήςνα αναφέρει συντακτικά λάθη µε έναν έξυπνο τρόπο. Επίσης θα πρέπει να µπορεί να µηνκολλάει σε συνηθισµένα λάθη έτσι ώστε να µπορεί να συνεχίσει την ανάλυση του υπόλοι-που string.

H είσοδος ενός συντακτικού αναλυτή (ΣΑ) είναι το αρχικό πρόγραµµα µε τη µορφή µιαςακολουθίας λεκτικών µονάδων. Η έξοδος του είναι το συντακτικό δέντρο που αντιστοιχείσε αυτό το πρόγραµµα, ή µια ένδειξη ότι το αρχικό πρόγραµµα δεν είναι συντακτικά ορθό.Στην πράξη όµως, ο ΣΑ συνεργάζεται στενά µε τις επόµενες φάσεις της µεταγλώττισηςκαι το συντακτικό δέντρο δεν είναι ορατό ως έξοδος αυτού του τµήµατος.

Οι κόµβοι του συντακτικού δέντρου περιέχουν τα σύµβολα µιας γραµµατικής. Συγκε-κριµένα, η ρίζα περιέχει το αρχικό σύµβολο, οι εσωτερικοί κόµβοι περιέχουν µη τερµατικάσύµβολα ενώ τα φύλλα περιέχουν τερµατικά σύµβολα. Επιπλέον, οι απόγονοι κάθε εσω-τερικού κόµβου ακολουθούν τους κανόνες παραγωγής της γραµµατικής.

2

Page 3: Bottom Up Latex

Έστω το παραπάνω συντακτικό δέντρο. Υπάρχουν δύο βασικοί τρόποι κατασκευής αυ-τού του συντακτικού δέντρου δεδοµένης της συµβολοσειράς εισόδου acabac. Στο σχήµαφαίνεται η πορεία που ακολουθεί η συντακτική ανάλυση µε έναν από τους δύο τρόπους.

Σύµφωνα µε αυτόν τον τρόπο, το δέντρο κατασκευάζεται ξεκινώντας από τα φύλλα καιπροχωρώντας προς τη ρίζα. Οι ΣΑ που βασίζονται σε αυτόν τον τρόπο ονοµάζονται συ-ντακτικοί αναλυτές από κάτω προς τα πάνω (bo om up parsers). Αυτός ο ΣΑ, καθώς και οΣΑ από πάνω προς τα κάτω (top down parser) ονοµάζονται ντετερµινιστικοί.

FIRST και FOLLOW

Τώρα θα ορίσουµε τα σύνολα FIRST και FOLLOW τα οποία είναι ιδιαίτερα χρήσιµα στηνκατασκευή των συντακτικών δέντρων, προκειµένου να αποφασιστεί ποιος κανόνας τηςγραµµατικής θα χρησιµοποιηθεί σε κάθε εσωτερικό κόµβο. Έστω µια γραµµατική G = (T,N, P, S). Για κάθε συµβολοσειρά α ∈ (T ⋃ N)⋆, ορίζεται το σύνολο FIRST(α) ⊆ T ⋃ { ε } ωςεξής:

• Αν υπάρχει κάποια δυνατή παραγωγή της µορφής α ⇒ ⋆ aβ, όπου a ∈ Τ και β ∈ (T ⋃N)⋆, τότε a ∈ FIRST(α).

• Αν υπάρχει µια δυνατή παραγωγή της µορφής α ⇒ ⋆ ε, τότε ε ∈ FIRST(α).

Με άλλα λόγια, το σύνολο FIRST(α) περιέχει όλα τα τερµατικά σύµβολα µε τα οποίαείναι δυνατόν να αρχίζουν οι συµβολοσειρές που παράγονται από την α. Αν η α παράγειτην κενή συµβολοσειρά, τότε το σύνολο FIRST(α) περιέχει επίσης και το ε.

3

Page 4: Bottom Up Latex

Ότανησυµβολοσειράααρχίζει µε τερµατικό σύµβολο, ο υπολογισµός του FIRST(α) είναιτετριµµένος, καθώς θα περιέχει µόνο αυτό το τερµατικό σύµβολο. Στην περίπτωση όµωςπου η α αρχίζει µε µη τερµατικό σύµβολο, έστω το Α ∈, θα πρέπει να υπολογιστούν τασύνολα FIRST(β) για κάθε κανόνα της µορφής Α → β που υπάρχει στη γραµµατική. Για τολόγο αυτό, ο υπολογισµός των συνόλων FIRST γίνεται συγχρόνως για όλα τα σύµβολα τηςγραµµατικής και τις συµβολοσειρές που απαντώνται σε δεξιά µέλη κανόνων.

Για κάθε µη τερµατικό σύµβολο Α ∈ Ν της ίδιας γραµµατικής G ορίζεται επίσης το σύ-νολο FOLLOW(A)⊆Τ⋃{EOF}, όπου µε EOF συµβολίζεται η λεκτική µονάδα που δηλώνει τοτέλος της συµβολοσειράς εισόδου:• Αν υπάρχει κάποια δυνατή παραγωγή της µορφής S⇒ ⋆ αΑaβ, όπου α,β ∈ (N⋃T)⋆ και a∈ Τ, τότε a ∈ FOLLOW(A).• Αν υπάρχει κάποια δυνατή παραγωγή της µορφής S⇒ ⋆αΑ, όπου α ∈ (N⋃T)⋆, τότε EOF∈ FOLLOW(A).

Με άλλα λόγια, το σύνολο FOLLOW για όλα τα µη τερµατικά σύµβολα µιας γραµµατι-κής γίνεται συγχρόνως.

Υπολογισµός συνόλων FIRST

Είσοδος: Η γραµµατική G=(T,N,P,S)Έξοδος:Τα σύνολα FIRST(A), για καθε A∈N, και FIRST(α), για κάθε επίθεµα α∈(T ⋃ N)⋆ δεξιού µέλους κανόνα της G.

για κάθε µη τερµατικό σύµβολο A∈Ν κάνεFIRST(A) := 0

τέλος βρόχουγια κάθε επίθεµα α ∈ (T ⋃ N)⋆ δεξιού µέλους κανόνα της G κάνε

αν α=ε τότεFIRST(α) := {ε}

αλλιώς αν α = aβ όπου a ∈Τ και β∈ (T ⋃ N)⋆τότεFIRST(α) := {a}

αλλιώςFIRST(α) := 0

τέλος αντέλοςβρόχουεπανάλαβε

για κάθε κανόνα A → α της GκάνεFIRST(A) := FIRST(A) ⋃ FIRST(α)

τέλος βρόχουγια κάθε επίθεµα α ∈(T ⋃ N)⋆ δεξιού µέλους κανόνα της Gκάνε

αν α=Αβ όπου Α ∈ Ν και β ∈ (T ⋃ N)⋆ τότεFIRST(α) := FIRST(α) ⋃ (FIRST(Α) - {ε})αν ε ∈ FIRST(A)τότε

FIRST(α) := FIRST(α) ⋃ FIRST(β)τέλος αν

τέλος αντέλος βρόχου {για κάθε α}

µέχρι να µην γίνουν άλλες µεταβολές στo FIRST(A) και FIRST(α)

Εφαρµόζοντας τον παραπάνω αλγόριθµο καταλήγουµε στα εξής αποτελέσµατα για τασύνολα FIRST των µη τερµατικών συµβόλων της γραµµατικής:

4

Page 5: Bottom Up Latex

Ε→ T E’E’→ εE’→ + T E’T → F T’T’→ εT’→ * F T’F→ (E)F→idFIRST(E) = FIRST(T) = FIRST(F) = {id, (}FIRST(E’) = {+,ε}FIRST(Τ’) = {*,ε}

Υπολογισµός συνόλων FOLLOW

Είσοδος: Η γραµµατική G=(T,N,P,S) και τα συνολα FIRSTΈξοδος:Τα σύνολα FOLLOW(A), για καθε A∈N

FOLLOW(S) := {EOF}για κάθε µη τερµατικό σύµβολο A∈Ν - {S}κάνε

FOLLOW(A) := 0τέλος βρόχουεπανάλαβε

για κάθε κανόνα A → α της G, όπου Α,Β∈Ν και α,β∈(T ⋃ N)⋆κάνεFOLLOW(B) := FOLLOW(B) ⋃ (FIRST(β) - {ε})αν ε ∈ FIRST(β)τότε

FOLLOW(B) := FOLLOW(B) ⋃ FOLLOW(A)τέλος αν

τέλος βρόχουµέχρι να µην γίνουν άλλες µεταβολές στo FOLLOW(A)

Εφαρµόζοντας τον παραπάνω αλγόριθµο καταλήγουµε στα εξής αποτελέσµατα για τασύνολα FIRST των µη τερµατικών συµβόλων της γραµµατικής:

FOLLOW(E) = FOLLOW(E’) = {),EOF}FOLLOW(T) = FOLLOW(T’) = {+,),EOF}FOLLOW(F’) = {*,+,),EOF}

3 Συντακτική ανάλυση από κάτω προς τα πάνω

Ένας ΣΑ από κάτω προς τα πάνω ξεκινά την κατασκευή του συντακτικού δέντρου απότα φύλλα, δηλαδή τα τερµατικά σύµβολα που περιέχονται στη συµβολοσειρά εισόδου. Στησυνέχεια, προσπαθεί να βρει τον αριστερότερο κόµβο του συντακτικού δέντρου που δενέχει ακόµα κατασκευαστεί, ενώ όλα τα παιδιά του έχουν κατασκευαστεί. Η διαδικασίααυτή συνεχίζεται µέχρι να κατασκευαστεί η ρίζα του δέντρου, που περιέχει το αρχικό σύµ-βολο S της γραµµατικής. Εποµένως, κάθε στιγµή ο καλείται να επιλέξει ποιους από τουςήδη κατασκευασµένος κόµβους θα χρησιµοποιήσει ως παιδιά του νέου κόµβου που θα κα-τασκευάσει. Η διαδικασία αυτή ονοµάζεται ελάττωση (reducing).

5

Page 6: Bottom Up Latex

Ας θεωρήσουµε τη γραµµατική G3 που ορίζεται ως εξής:S → r BD|B, Da|bΣτο παρακάτω σχήµα φαίνεται µια δυνατή κατασκευή του συντακτικού δέντρου που αντι-στοιχεί στη συµβολοσειρά εισόδου ”r a, b” από κάτω προς τα πάνω. Σε κάθε βήµα της κα-τασκευής, οι έντονες γραµµές καταλήγουν στα σύµβολα που επιλέγονται για ελάττωση.

Μια γενική κατηγορία συντακτικών αναλυτών από κάτωπρος τα πάνω είναι η κατηγο-ρία των ΣΑ ολίσθησης-ελάττωσης (shift-reduce parsers). Οι αναλυτές αυτοί χρησιµοποιούνµιαστοίβαστην οποία τοποθετούν τερµατικά και µη τερµατικάσύµβολα της γραµµατικής.Η στοίβα είναι αρχικά κενή. Κατά τη λειτουργία τους, εκτελούν δυο ειδών πράξεις:

• Η πράξη της ολίσθησης (shift) αφαιρεί ένα σύµβολο από την αρχή της συµβολοσειράςεισόδου και το τοποθετεί στην κορυφή της στοίβας.

• Η πράξη της ελάττωσης (reduce) δεν επηρεάζει τη συµβολοσειρά εισόδου αλλά µπορείνα εφαρµοστεί µόνο όταν στην κορυφή της στοίβας έχει εµφανισθεί το δεξιό µέλος κά-ποιου συντακτικού κανόνα. Τότε, τα σύµβολα που αποτελούν το δεξιό µέλος του κανόνααφαιρούνται από τη στοίβα και στην κορυφή αυτής προστίθεται το αριστερό µέλος τουκανόνα.

Η διαδικασία αυτή τερµατίζεται όταν η στοίβα περιέχει µόνο το αρχικό µη τερµατικόσύµβολο της γραµµατικής και έχει εξαντληθεί η συµβολοσειρά εισόδου. Στην περίπτωσηαυτή, η συµβολοσειρά εισόδου αναγνωρίζεται. Διαφορετικά, αν η διαδικασία καταλήξει σεαδιέξοδο, η συµβολοσειρά εισόδου απορρίπτεται.

Για παράδειγµα: Ας θεωρήσουµε τη γραµµατικήS → αABe

6

Page 7: Bottom Up Latex

A → Abc|bB → d

Η πρόταση abbcde µπορεί να µειωθεί στην S µε τα ακόλουθα βήµατα:αbbcdeαAbcdeαAdeαABeS

Αναλύουµε το αbbcde ψάχνοντας για ένα υποχαρακτήρα που ταιριάζει στο δεξιό µέ-λος κάποιου παραγώγου. Οι υποχαρακτήρες b και d ικανοποιούν αυτή τη συνθήκη. Επιλέ-γουµε το αριστερότερο b και το αντικαθιστούµε µε A, την αριστερή πλευρά του A→ b. Έτσιέχοµε το string αAbcde. Τώρα οι υποακολουθίες χαρακτήρων Abc, b και d ταιριάζουν µε τοδεξιό µέλος µίας παραγωγής και έτσι επιλέγουµε να αντικαταστήσουµε το Abc µε Α, τοαριστερό µέλος του A→ Abc. Τώρα έχουµε αAde. Μετά αντικαθιστώντας το d µε B έχουµεαABe. Τώρα µπορούµε να αντικαταστήσουµε όλο αυτό το string µε το S. Έτσι µε µία διαδι-κασία τεσσάρων µειώσεων µπορούµε να µειώσουµε το αbbcde σε S. Πιο συγκεκριµένα, καιακολουθώντας την αντίστροφη διαδικασία έχουµε:

S⇒αABe⇒αAde⇒αAbcde⇒αbbcde

βήµα||στοίβα||είσοδος||περιγραφή κίνησης0 ε r a,b ολίσθηση1 r a,b ολίσθηση2 ra ,b ελάττωση µε τον κανόνα D→a3 rD ,b ελάττωση µε τον κανόνα Β→D4 rB ,b ολίσθηση5 rB, b ολίσθηση6 rB,d ε ελάττωση µε τον κανόνα D→b7 rB,D ε ελάττωση µε τον κανόνα Β→Β, D8 rB ε ελάττωση µε τον κανόνα S→rB9 S ε αναγνώριση

Ας θεωρήσουµε και πάλι τη γραµµατική G3 και τη συµβολοσειρά ”r a, b”. Για την ανα-γνώρισή της, ένας ΣΑ ολίσθησης-ελάττωσης µπορεί να κάνει τα βήµατα που φαίνονταιστο παραπάνω σχήµα.Στο βήµα 4, ο ΣΑ έχει δύο επιλογές: ολίσθηση ή ελάττωση µε τον κανόνα S → rB. Η δεύ-τερη επιλογή όµως καταλήγει σε αδιέξοδο γιατί η συντακτική ανάλυση τελειώνει χωρίς ναέχει σαρωθεί όλη η συµβολοσειρά εισόδου. Η περίπτωση αυτή είναι γνωστή ως σύγκρουσηολίσθησης-ελάττωσης (shift-reduce conflict). Επίσης στο βήµα 7 ο ΣΑ είχε πάλι δύο επιλο-γές: ελάττωση µε τον κανόνα B → B ή ελάττωση µε τον κανόνα B → D. Και πάλι η δεύτερηεπιλογή οδηγεί σε αδιέξοδο. Η περίπτωση αυτή είναι γνωστή ως σύγκρουση ελάττωσης-ελάττωσης(reduce-reduce conflict).

Για να µη χρειάζεται ένας ΣΑ ολίσθησης-ελάττωσης να οπισθοδροµεί, κάτι που είναιιδιαίτερα δαπανηρό τόσο σε ταχύτητα εκτέλεσης όσο και σε κατανάλωση µνήµης, πρέπεινα µπορεί να επιλύει σωστά τις ενδεχόµενες συγκρούσεις. Ένας τέτοιος ΣΑ ονοµάζεταιντετερµινιστικός.

7

Page 8: Bottom Up Latex

”Χειριστές”

Ανεπίσηµα, ένας χ�ειριστήςµ�ίας συµβολοσειράς είναι ένα υποσύνολο της συµβολοσει-ράς που ταιριάζει µε το δεξιό µέλος της παραγωγής, και του οποίου η πράξη reduce σε µητερµατική κατάσταση στο αριστερό µέλος µία παραγωγής αντιπροσωπεύει ένα βήµα στηναντιστροφή της δεξιότερης παραγωγής. Σε πολλές περιπτώσεις, το αριστερότερο υποσύ-νολο της συµβολοσειράς β που ταιριάζει µε το δεξιό µέλος της παραγωγής Α → β δεν είναιχ�ειριστής„� επειδήµίαπράξη reduce τουΑ→βπαράγει µία συµβολοσειράπου δενµπορείνα γίνει reduce σε ένα αρχικό σύµβολο.

Επισήµως, ένας χ�ειριστήςµ�ίας δεξιάς προτασιακής µορφής γ είναι µία παραγωγή Α→ β και µία θέση του γ όπου η συµβολοσειρά β, µπορεί να βρεθεί και να αντικατασταθείαπό την A ώστε να παράγουµε την προηγούµενη δεξιά προτασιακή µορφή στην δεξιότερηπαραγωγή του γ. Πρέπει να παρατηρηθεί ότι λέµε έ�νας χειριστήςκ�αι όχι Ο� χειριστή-ςγ�ιατί η γραµµατική µπορεί να έχει ασάφειες. Αυτό ισχύει αν S ⇒ αΑw ⇒ αβw, τότε το Α→ β στην θέση µετά το α, είναι ένας χειριστής του αβw. H συµβολοσειρά w στα δεξιά τουχειριστή περιέχει µη τερµατικά σύµβολα. Αν η γραµµατική είναι σαφής, τότε κάθε δεξιάπροτασιακή µορφή της γραµµατικής έχει ακριβώς έναν χειριστή.

Στο από πάνω παράδειγµα, αbbcde είναι µία δεξιά προτασιακή µορφή της οποίας ο χει-ριστής είναι ο Α → b στην θέση 2. Αντιστοίχως, αAbcde είναι µία δεξιά προτασιακή µορφήτης οποίας ο χειριστής είναι ο A→Αbc στην θέση 2. Μερικές φορές λέµε ότι τ�ο υποσύνολοτης συµβολοσειράς β είναι ένας χειριστής του αβwα�ν η θέση του β και η παραγωγή Α →β που έχουµε χρησιµοποιήσει είναι ξεκάθαρα.

Στο παρακάτω σχήµα, φαίνεται ο χειριστής A → β στο δέντρο συντακτικής ανάλυσηςµίας δεξιά προτασιακής µορφής αβw. Ο χειριστής αντιπροσωπεύει το αριστερό ολοκλη-ρωµένο υποδέντρο που περιέχει έναν κόµβο και όλα τα παιδιά του. Επίσης το A είναι οχαµηλότερος, αριστερότερος, εσωτερικός κόµβος µε όλα τα παιδιά του στο δέντρο. Κάνο-ντας reduce το β σε A στην αβw, µπορούµε να θεωρήσουµε ότι κ�λαδεύουµε το δέντρο,�αφαιρώντας τα παιδιά του A από το δέντρο της συντακτικής ανάλυσης.

Παράδειγµα

Ας θεωρήσουµε την παρακάτω γραµµατική:(1) Ε → E + E(2) E → E * E(3) E → (E’)(4) E → id

και την δεξιότερη παραγωγή

E ⇒ E+E⇒ E + E * E⇒ E + E * id3⇒ E + id2 * id3⇒ id1 + id2 * id3

8

Page 9: Bottom Up Latex

Έχουµε βάλει δείκτες στα id χάριν ευκολίας και υπογραµµίσαµε τους χειριστές κάθεδεξιάς προτασιακής µορφής. Για παράδειγµα το id1 είναι ένας χειριστής της δεξιά προ-τασιακής µορφής id1 + id2 * id3, επειδή το id είναι το δεξιό µέλος της παραγωγής Ε → καιαντικαθιστώντας το id1 µε το E, παράγουµε την προηγούµενη δεξιά προτασιακή µορφή E +id2 * id3. Πρέπει να σηµειωθεί ότι η συµβολοσειρά που εµφανίζεται στα δεξιά ενός χειριστήπεριέχει µόνο τερµατικά σύµβολα.Επειδή η προηγούµενη γραµµατική είναι ασαφής, υπάρχει µία δεξιότερη παραγωγή τηςίδιας συµβολοσειράς:

E ⇒ E*E⇒ E * id3⇒ E+E * id3⇒ E + id2 * id3⇒ id1 + id2 * id3

Θεωρούµε την δεξιά προτασιακή µορφή Ε + Ε * id3. Σε αυτή την παραγωγή, Ε + Ε είναι ο χει-ριστής του Ε + Ε * id3 όπου το id3 µόνο του είναι ένας χειριστής της ίδιας δεξιάς προτασιακήςµορφής σύµφωνα µε την παραπάνω παραγωγή.

Στις δύο αυτές δεξιότερες παραγωγές, η πρώτη δίνει στο * µεγαλύτερη προτεραιότητααπό το +, ενώ η δεύτερη δίνει στο + την µεγαλύτερη προτεραιότητα.

Κλάδεµα Χειριστών

Μία δεξιότερη παραγωγή σε αντιστροφή µπορεί να δηµιουργηθεί αν κλαδέψουµε τουςχειριστές. Αυτό γίνεται, ξεκινώντας µε µία συµβολοσειρά από τερµατικές καταστάσεις wπου επιθυµούµε να αναλύσουµε. Αν το w είναι µία πρόταση µίας γραµµατικής που διαθέ-τουµε τότε w = γnπουγn είναι η nοστή δεξιά προτασιακή µορφή µίας άγνωστης µέχρι τώραδεξιάς παραγωγής.

S = γ0 ⇒ γ1 ⇒ γ2 ⇒ ... ⇒ γn−1 ⇒ γn = w

9

Page 10: Bottom Up Latex

Για να ανασκευάσουµε αυτήν την παραγωγή µε αντίστροφη σειρά, εντοπίζουµε τον χει-ριστή βn στο γn και αντικαθιστούµε το βn µε την αριστερή µορφή µίας παραγωγής Αn →βn ώστε να πάρουµε το (n-1)οστή δεξιά προτασιακή µορφή γn−1. Ας σηµειώσουµε ότι δενξέρουµε ακόµα πως βρίσκονται οι χειριστές.

Μετά επαναλαµβάνουµε την διαδικασία. Δηλαδή, εντοπίζουµε τον χειριστή βn−1 στο γn−1και κάνουµε reduce αυτόν τον χειριστή για να πάρουµε την δεξιά προτασιακή µορφή γn−2.Αν, συνεχίζοντας τη διαδικασία, παράγουµε µία δεξιά προτασιακή µορφή που περιέχειµόνο το αρχικό σύµβολο S, τότε σταµατάµε και ανακοινώνουµε µία επιτυχηµένη ολοκλή-ρωση της συντακτικής ανάλυσης.Το αντίστροφο στην ακολουθία των παραγωγών πουχρησιµοποιείται στις πράξεις reduce, είναι µία δεξιά προτασιακή παραγωγή για την συµ-βολοσειρά εισόδου.

Η στοίβα της ανάλυσης shift-reduce

Υπάρχουν δύο προβλήµατα που πρέπει να λυθούν. Το πρώτο είναι να εντοπιστεί το υπο-κείµενο προς µείωση σε µία σωστή προτασιακή µορφή, και το πρόβληµα είναι να καθορί-σουµε ποιά συνθήκη να επιλέξουµε σε περίπτωση που υπάρχουν περισσότερες από µίαστο δεξιό µέρο της παραγωγής. Πριν πάµε σε αυτές τις ερωτήσεις ας σκεφτούµε πρώτατου τύπους των δοµών δεδοµένων που θα χρησιµοποιήσουµε στον αναλυτή shift-reduce.

Μία βολική µέθοδος για να δηµιουργήσουµε έναν αναλυτή shift-reduce είναι να χρησι-µοποιήσουµε µία στοίβα ώστε να κρατάµε τα σύµβολα της γραµµατικής και έναν bufferπου θα κρατάει τη συµβολοσειρά w που είναι προς ανάλυση. Χρησιµοποιούµε το $ για ναδιακρίνουµε τον πάτο της στοίβας και επίσης το δεξιό µέλος της εισόδου. Αρχικά, η στοίβαείναι άδεια και η συµβολοσειρά w είναι στην είσοδο όπως φαίνεται παρακάτω:

Αυτός ο αναλυτής λειτουργεί µε shift του µηδέν ή άλλων συµβόλων εισόδου στη στοίβαµέχρι να βρεθεί ένας handle β στην κορυφή. Ο αναλυτής µετά κάνει reduce το b στην αρι-στερή πλευρά της κατάλληλης παραγωγής. Ο αναλυτής επαναλαµβάνει αυτόν τον κύκλοµέχρι να ανιχνευτεί ένα λάθος ή µέχρι η στοίβα ναπεριέχει το αρχικό σύµβολο και το πεδίοεισόδου είναι άδειο:

Στο τέλος ο αναλυτής σταµατάει και ανακοινώνει µία σωστή ολοκλήρωση της ανάλυ-σης.

Παράδειγµα Ας αναλύσουµε τώρα βήµα, βήµα τις δράσεις ενός αναλυτή shift-reduceόταν δεχόµαστε ως είσοδο το id1 + id2 ∗ id3 σύµφωνα µε την παρακάτω γραµµατική:E → E + T | TT → T * F | FF → (E) | id

10

Page 11: Bottom Up Latex

ή πιο αναλυτικά:Ε → TE’E’ → +TE’|εT → FT’T’ → *FT’|εF → (E) |id

Έτσι έχουµε:

Ενώοι βασικές διαδικασίες τουαναλυτή είναι η shift και η reduce, υπάρχουν 4 διαδικασίεςπου µπορεί να πραγµατοποιήσει ο αναλυτής: (1)Shift, (2) Reduce, (3) Accept και (4)Error.

1. Σε µία πράξη shift, το επόµενο σύµβολο εισόδου γίνεται shift στην κορυφή της στοίβας

2. Σε µία πράξη reduce, ο αναλυτής ξέρει ότι η σωστή κατάληξη είναι στην κορυφή τηςστοίβας. Πρέπει τότε να εντοπίσει την αριστερή τερµατική κατάσταση µέσα στη στοίβακαι να αποφασίσει µε ποιά µη τερµατική κατάσταση θα την αντικαταστήσει.

3. Σε µία πράξη accept, ο αναλυτής ανακοινώνει την επιτυχηµένη ολοκλήρωση της ανά-λυσης.

Σε µία πράξη error, Ο αναλυτής ανακαλύπτει κάποιο συντακτικό λάθος και καλεί µίαρουτίνα για αποφυγή του λάθους.

Υπάρχει ένα σηµαντικό γεγονός που δικαιολογεί την χρήση της στοίβας στην ανάλυσηshift reduce: ο χειριστής πάντα, εν τέλει, εµφανίζεται στην κορυφή της στοίβας και ποτέµέσα σε αυτή. Αυτό το γεγονός γίνεται προφανές όταν σκεφτούµε τις πιθανές µορφές δύοδιαδοχικών βηµάτων. Αυτά τα βήµατα µπορεί να είναι της µορφής:

(1) S⇒ αAz ⇒ αβByz ⇒ αβγyz

(2) S⇒ ΑΒxAz ⇒ αΒxyz ⇒ αγxyz

11

Page 12: Bottom Up Latex

Στην περίπτωση (1), το A αντικαθιστάται από το βΒy και µετά η δεξιότερη µη τερµατικήκατάσταση Β σε αυτήν την δεξιά πλευρά αντικαθιστάται από το γ. Στην περίπτωση (2),το Α αντικαθιστάται και πάλι πρώτο, αλλά αυτή τη φορά η δεξιά πλευρά είναι µία συµ-βολοσειρά µόνο τερµατικών καταστάσεων. Το επόµενο δεξιότερο µη τερµατικό B θα είναικάπου στα αριστερα του y.

Ας θεωρήσουµε την περίπτωση (1) αντίστροφα, όπου ένας αναλυτής shift-reduce έχειµόλις αρχίσει την παρακάτω διαµόρφωση.

O Αναλυτής τώρα µειώνει το γ σε Β για να φτάσει στην παρακάτω διαµόρφωση.

Εφόσον ο B είναι το δεξιότερο µη τερµατικό στο αβΒyz, η αριστερή άκρη του αβΒyz δενµπορεί να υπάρχει µέσα στη στοίβα. Ο αναλυτής µπορεί έτσι να κάνει shift τη συµβολο-σειρά y πάνω στη στοίβα ώστε να φτάσει στην παρακάτω διαµόρφωση.

στην οποία διαµόρφωση, το bBy µειώνεται σε A. Στην διαµόρφωση της περίπτωσης (2)έχουµε:

Το γ είναι στην κορυφή της στοίβας. Μετά από την µείωση του γ σε B, ο αναλυτής µπορείνα κάνει shift την συµβολοσειρά xy ώστε να φέρει το y στην κορυφή της στοίβας όπωςφαίνεται παρακάτω:

Τώρα ο αναλυτής µειώνει το y σε A.

12

Page 13: Bottom Up Latex

Και στις δύο περιπτώσεις, αφού κάνουµε ένα reduce ο αναλυτής πρέπει να κάνει shiftσε κανένα ή περισσότερα σύµβολα ώστε να φέρει το επόµενο στοιχείο στην κορυφή τηςστοίβας. Ποτέ δεν έπρεπε να µπει µέσα στην στοίβα για να βρει το στοιχείο. Για αυτόνκυρίως τον λόγο η στοίβα είναι µία βολική δοµή δεδοµένων για την διαδικασία shift-reduceενός αναλυτή. Στη συνέχεια θα αναλύσουµε τους αναλυτές LR.

Συντακτικοί αναλυτές LR(k)

ΟιΣΑπουανήκουνσεαυτή τηνκατηγορία είναι ντετερµινιστικοί ΣΑολίσθησης-ελάττωσης.Διαβάζουν τη συµβολοσειρά εισόδου από αριστερά προς τα δεξιά (left-to-right) και κατα-σκευάζουν τοσυντακτικό δέντροακολουθώντας τη δεξιότερηπαραγωγή (rightmost derivation)σεαντίστροφησειρά. Επίσης, ο αριθµός τωνπροπορευόµενωνσυµβόλων (look-ahead symbols)που διαβάζουν είναι ίσος µε k. Στην πράξη, χρησιµοποιούνται πιο συχνά οι ΣΑ LR(1), κα-θώς είναι ιδιαίτερα δύσκολο να υλοποιηθούν ΣΑ για µεγαλύτερο k από 1. Οι γραµµατι-κές που παράγουν γλώσσες οι οποίες αναγνωρίζονται από κάποιο ΣΑ LR(1) ονοµάζονταιγραµµατικές LR(1).

Οι ΣΑ LR(1) υλοποιούνται µε τη µορφή αυτοµάτων στοίβας ειδικής µορφής, όπως φαί-νεται στο παρακάτω σχήµα.

Το αυτόµατο αποτελείται από:

•Μια ενδιάµεση µνήµη απ’ όπου διαβάζεται η συµβολοσειρά εισόδου, µια λεκτική µο-νάδα κάθε φορά.

•Ένα πεπερασµένο σύνολο καταστάσεων Κ και µια ειδική κατάσταση s0 ∈K που ονοµά-ζεται αρχική.

13

Page 14: Bottom Up Latex

a •Μια στοίβα όπου τοποθετούνται εναλλάξ σύµβολα της γραµµατικής (τερµατικά καιµη τερµατικά) και καταστάσεις από το σύνολο Κ. Πριν από κάθε κίνηση του αυτοµάτου,τα σύµβολα που βρίσκονται στην κορυφή και στον πυθµένα της στοίβας είναι πάντα κα-ταστάσεις. Στην πραγµατικότητα, όπως θα φανεί στη συνέχεια, η τοποθέτηση συµβόλωντης γραµµατικής στη στοίβα είναι περιττή και µπορεί να παραλειφθεί στην υλοποίηση τωνΣΑ LR(1).

•Ένα διδιάστατο πίνακα ελέγχου ACTION που ονοµάζεται πίνακας πράξεων. Ο πίνα-κας αυτός περιέχει µια γραµµή για κάθε κατάσταση s ∈ Κ και µια στήλη για κάθε τερµα-τικό σύµβολο a ∈ T. Επιπλέον, περιέχει µια ακόµα στήλη για το ειδικό σύµβολο EOF, πουαντιστοιχεί στο τέλος της συµβολοσειράς εισόδου. Κάθε στοιχείο ACTION(s,a) µπορεί ναπεριέχει µια πράξη ή να είναι κενό. Οι δυνατές πράξεις είναι:

-ολίσθηση

-ελάττωση µε κάποιον κανόνα της γραµµατικής, ή

-αποδοχή

•Ένα διδιάστατο πίνακα ελέγχου NEXT που ονοµάζεται πίνακας επόµενης κατάστα-σης. Ο πίνακας αυτός περιέχει µια γραµµή για κάθε κατάσταση s ∈ K και µία στήλη γιακάθε σύµβολο x ∈ T ⋃ N της γραµµατικής (τερµατικό και µη τερµατικό). Κάθε στοιχείοNEXT(s,x) µπορεί να περιέχει µια κατάσταση ή να είναι κενό.

Λειτουργία συντακτικού αναλυτή LR(1)

Η λειτουργία του ΣΑ LR(1) είναι περισσότερο πολύπλοκη από αυτή του ΣΑ LL(1). Στηναρχή η στοίβα περιέχει µόνο την αρχική κατάσταση. Σε κάθε βήµα του αυτοµάτου, η λει-τουργία του καθορίζεται από την κατάσταση που βρίσκεται στην κορυφή της στοίβας καιτο επόµενο σύµβολο της συµβολοσειράς εισόδου. Συγκεκριµένα, έστω ότι στην κορυφήτης στοίβας βρίσκεται η κατάσταση s ∈ Κ και ότι το επόµενο σύµβολο της συµβολοσειράςεισόδου είναι το a ∈ Τ ⋃ {ΕOF}.

Τότε εξετάζεται το στοιχείο ACTION(s,a) του πίνακα πράξεων:

•Αν περιέχει την πράξη της ολίσθησης, τότε το σύµβολο a αφαιρείται από τη συµβολο-σειρά εισόδου και τοποθετείται στην κορυφή της στοίβας. Στη συνέχεια τοποθετείται στηστοίβα η κατάσταση NEXT(s,a).

•Ανπεριέχει την πράξη της ελάττωσης µε έναν κανόνα της µορφήςA→ α, τότε αφαιρού-νται από τη στοίβα τόσα ζεύγη συµβόλων όσα είναι τα σύµβολα που περιέχονται στη συµ-βολοσειρά α. Έστω ότι τώρα στην κορυφή της στοίβας βρίσκεται η κατάσταση s’∈Κ. Τοπο-θετείται στη στοίβα το σύµβολο Α και στη συνέχεια τοποθετείται η κατάστασηNEXT(s’,A).

•Αν περιέχει την πράξη της αποδοχής, τότε η λειτουργία του ΣΑ σταµατά και η συµβο-λοσειρά εισόδου αναγνωρίζεται.

14

Page 15: Bottom Up Latex

Η διαδικασία συνεχίζεται µέχρι να καταλήξει σε πράξη αποδοχής ή να οδηγηθεί σε κά-ποιο στοιχείο των πινάκων ACTION ή NEXT που να είναι κενό. Στη δεύτερη περίπτωση, ησυµβολοσειρά εισόδου απορρίπτεται.

Κατασκευή των πινάκων ελέγχου LR(1)

Σε αντίθεση µε τους ΣΑ LL(1),για τους οποίους ο πίνακας συντακτικής ανάλυσης LL(1)ορίζεται µε µοναδικό τρόπο, στην περίπτωση των ΣΑ LR(1) υπάρχουν αρκετοί δυνατοί τρό-που κατασκευής των πινάκων ελέγχου ACTION και NEXT. Σηµαντικότεροι από αυτούςείναι οι ακόλουθοι:

•Οαλγόριθµος LR(0) µπορεί να χρησιµοποιηθεί στην περίπτωσηπου η γραµµατική ανή-κει στην κατηγορία LR(0) και δεν απαιτεί την προεπισκόπηση λεκτικών µονάδων για τηναναγνώριση της. Δυστυχώς η κατηγορία αυτή είναι πολύ περιοριστική και αυτός ο αλγό-ριθµος, αν και σηµαντικός από θεωρητικής πλευράς, δεν χρησιµοποιείται στην πράξη.

• Ο αλγόριθµος SLR(1), ή Simple LR(1), έχει σήµερα µικρή πρακτική αξία. Καλύπτει µε-γαλύτερο εύρος γλωσσών από τον LR(0), είναι όµως και αυτός αρκετά περιοριστικός.

• Ο πλήρης αλγόριθµος LR(1) µπορεί να χρησιµοποιηθεί για όλες τις γλώσσες που ανή-κουν στην κατηγορία LR(1). Το µειονέκτηµα του είναι ότι το µέγεθος των πινάκων ελέγχουπου κατασκευάζονται µε αυτόν είναι συνήθως πολύ µεγάλο, και άρα οι ΣΑ που υλοποιού-νται µε αυτόν έχουν υπερβολικά µεγάλες απαιτήσεις µνήµης.

• Ο αλγόριθµος LALR(1) είναι αυτός που χρησιµοποιείται περισσότερο στην πράξη. Βρί-σκεται κάπου ανάµεσα στους SLR(1) και LR(1) τόσο από πλευράς εκφραστικής ισχύος όσοκαι από πλευράς απαιτήσεων µνήµης.

Οι κατηγορίες γλωσσών που µπορούν να αναγνωρισθούν µε βάση αυτούς τους τέσσεριςαλγόριθµους σχετίζονται µεταξύ τους ως εξής:

LR(0) ⊂ SLR(1) ⊂ LALR(1) ⊂ LR

Σε όλες τις περιπτώσεις, η διαδικασία λειτουργίας του ΣΑ για την αναγνώριση µιας συµ-βολοσειράς είναι η ίδια.

4 Ανάνηψη από σφάλµατα

Οι στόχοι που πρέπει να ικανοποιεί το τµήµα διαχείρισης σφαλµάτων ενός ΣΑ είναι οιακόλουθοι:

• Να αναφέρει µε σαφήνεια και ακρίβεια τα σφάλµατα που εντοπίζει, έτσι ώστε να διευ-κολύνεται ο προγραµµατιστής στη διόρθωση τους.

•Ναµπορεί µετά από κάθε σφάλµα να συνεχίζει τη συντακτική ανάλυση, ώστε να εντο-πίσει περισσότερα σφάλµατα.

15

Page 16: Bottom Up Latex

• Να µην επιβραδύνει πολύ τη µεταγλώττιση ορθών προγραµµάτων.

Η αποτελεσµατική υλοποίηση αυτών των στόχων παρουσιάζει αρκετές δυσκολίες. Ευτυ-χώς τασυνηθισµένασφάλµατα είναι απλά.Ωστόσοσε ορισµένεςπεριπτώσεις, ένασφάλµαµπορεί να έχει συµβεί αρκετά πριν από τη θέση στην οποία η παρουσία του εντοπίζεταικαι η ακριβής φύση του µπορεί να είναι δύσκολο να διαπιστωθεί. Αρκετές µέθοδοι συντα-κτικής ανάλυσης, όπως η LL(1), εντοπίζουν τα σφάλµατα το συντοµότερο δυνατόν, µόλιςδηλαδή διαβαστεί ένα πρόθεµα της συµβολοσειράς εισόδου που δεν είναι πρόθεµα καµίαςσυµβολοσειράς που παράγεται από τη συγκεκριµένη γλώσσα (viable prefix priority).

Όταν διαπιστώνεται ένα σφάλµα, το τµήµα διαχείρισης σφαλµάτων του µεταγλωττιστήθα πρέπει τουλάχιστον να αναφέρει τη θέση που αυτό εντοπίστηκε µέσα στο αρχικό πρό-γραµµα, καθώς υπάρχει µεγάλη πιθανότητα το σφάλµα στην πρα㬵ατικότητα να έχεισυµβεί σε κάποια από τις αµέσως προηγούµενες λεκτικές µονά¬δες. Πολλοί µεταγλωττι-στές εµφανίζουν τη γραµµήκαι υποδεικνύουνσεαυτήν τηνακριβήθέση όπου εντοπίστηκετο σφάλµα. Αν µπορεί ο µεταγλωττιστής να συνά¬γει και την ακριβή φύση του σφάλ-µατος, τότε εµφανίζει και ένα σύντοµο κατανοητό διαγνωστικό µήνυµα, π.χ. ”expectedsemicolon”.

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

Μια απλή στρατηγική για τη διόρθωση αυτού του προβλήµατος είναι ο µεταγλωττιστήςνα παραλείπει τα µηνύµατα σφαλµάτων που εντοπίζονται πολύ κοντά σε άλλα σφάλ-µατα. Αφού εντοπίσει κάποιο σφάλµα, ο µεταγλωττιστής θα πρέπει να αφήσει να περά-σουν αρκετές λεκτικές µονάδες προτού επιτρέψει την εµφάνιση άλλου δια¬γνωστικού µη-νύµατος. Καλό είναι επίσης να υπάρχει και ένα άνω όριο σφαλµάτων, το οποίο αν ξεπε-ραστεί να αναγκάζει τη διακοπή της µεταγλώττισης.

Ορισµένοι µεταγλωττιστές επιχειρούν τη διόρθωση τωνσφαλµάτων (error repair).Ηυλο-ποίηση ωστόσω τέτοιων µεταγλωττιστών δε φαίνεται να είναι αποδοτική, καθώς τα προ-γράµµατα µπορούν να είναι αυθαίρετα πολύπλοκα και να περιέ¬χουν µεγάλο αριθµόσφαλµάτων. Γίνεται λοιπόν κατανοητό ότι για την ικανοποιητική υλοποίηση µιας διαδι-κασίας ανάνηψης από σφάλµατα πρέπει να γίνουν αρκετοί συµβιβασµοί και να ληφθούναπαραιτήτως υπόψη τα είδη των σφαλµάτων που είναι πιο πιθανό να συµβούν, και πουείναι πιο εύκολα στην αντιµετώπιση τους. Με την έµφαση που δίνεται τώρα στα φιλικάπρογραµµατιστικά περιβάλλοντα και στο διαλογικό προγραµµατισµό, καθώς και µε τη

16

Page 17: Bottom Up Latex

ραγδαία βελτίωση της ταχύτητας των ηλεκτρονικών υπολογιστών, η σηµερινή τάση είναιπρος την υλοποίηση απλών µηχανισµών για την ανάνηψη από σφάλµατα.

Στρατηγικές για ανάνηψη από σφάλµατα

Υπάρχουν αρκετές διαφορετικές στρατηγικές που µπορεί να χρησιµοποιήσει ένας ΣΑγια το σκοπό αυτό. Αν και δεν υπάρχει κάποια µέθοδος που να είναι καθολικά αποδε-κτή, ορισµένες γνωρίζουν µεγάλη εφαρµογή. Παρακάτω θα σκιαγραφηθούν οι ακόλουθεςστρατηγικές:

• Η µέθοδος πανικού (panic mode), που είναι η απλούστερη µέθοδος ως προς την υλο-ποίηση και η οποία µπορεί να χρησιµοποιηθεί από τις περισσότερες µεθόδους συντακτι-κής ανάλυσης. Εντοπίζοντας κάποιο σφάλµα, ο ΣΑ διαβάζει µια-µια τις επόµενες λεκτι-κές µονάδες από τη συµβολοσειρά εισόδου, ώσπου να βρεθεί κάποια που να ανήκει σε έναπροκαθορισµένο σύνολο λεκτικών µονάδων ”συγχρονισµού”. Συνήθως για το σκοπό αυτόεπιλέγονται κατάλληλες διαχωριστικές λεκτικές µονάδες (delimiters), όπως το ερωτηµα-τικό (semicolon) ή η λέξη κλειδί end, η σηµασία των οποίων στο αρχικό πρόγραµµα είναιξεκάθαρη. Ο σχεδιαστής του µεταγλωττιστή πρέπει φυσικά να διαλέξει τις κατάλληλεςλεκτικές µονάδες συγχρονισµού για τη συγκεκριµένη αρχική γλώσσα προγραµµατισµού.Παρά το γεγονός ότι αυτή η στρατηγική συχνά παραλείπει να ελέγξει για επιπλέον σφάλ-µατα ένα µέρος της εισόδου, έχει το πλεονέκτηµα της απλότητας και είναι αδύνατο ναυποπέσει σε ατέρµονα κύκλο, αντίθετα από κάποιες άλλες µεθόδους που θα αναφερθούνπαρακάτω. Η µέθοδος αυτή δίνει ικανοποιητικά αποτελέσµατα, βασισµένη στην παρα-δοχή ότι η ύπαρξη περισσότερων από ενός σφαλµάτων στην ίδια γραµµή είναι µάλλονσπάνια.

• Η ανάνηψη σε επίπεδο φράσης (phrase level). Σύµφωνα µε αυτή τη µέθοδο αυτή, ότανο ΣΑ εντοπίζει ένα σφάλµα, επιχειρεί να διορθώσει τοπικά την υπόλοιπη συµβολοσειράεισόδου, δηλαδή να αντικαταστήσει ένα πρόθεµα της συµβολοσειράς που αποµένει µε κά-ποια άλλη συµβολοσειρά, η οποία θα επιτρέψει στο συντακτικό αναλυτή να συνεχίσει.Μιατέτοια χαρακτηριστική διόρθωση µπορεί να είναι η αντικατάσταση ενός ερωτηµατικού(semicolon) µε ένα κόµµα ή αντίστροφα. Η επιλογή του είδους της τοπικής διόρθωσης επα-φίεται στο σχεδιαστή του µεταγλωττιστή. Σηµειώνεται πάντως ότι αυτή η µέθοδος πρέ¬πεινα εφαρµόζεται µε προσοχή, ώστε να µην οδηγεί σε ατέρµονες κύκλους. Για παράδειγµα,ένας τέτοιος κύκλος θα µπορούσε να δηµιουργηθεί αν στην προσπάθεια διόρθωσης συ-νεχώς εισάγεται κάποια λεκτική µονάδα πριν από το τρέχον σύµβολο εισόδου. Πάντως,η µέθοδος αυτή είναι γενικά σε θέση να διορθώσει οποιαδήποτε ακολουθία εισόδου καιέχει χρησιµοποιηθεί µε επιτυ-χία σε αρκετούς µεταγλωττιστές. Αρχικά εφαρµόστηκε σεσυντακτικούς αναλυτές από πάνω προς τα κάτω. Το κυριότερο µειονέκτηµα της είναι ηδυσκολία στην αντιµετώπιση σφαλµάτων που έχουν συµβεί πριν το σηµείο όπου τελικάεντοπίζονται.

• Οι κανόνες παραγωγής σφαλµάτων (error productions). Αν ο σχεδιαστής του µεταγλωτ-τιστή έχει µια αρκετά καλή ιδέα των πιο κοινών σφαλµάτων που θα αντιµετωπισθούν,µπορεί να επαυξήσει τη γραµµατική της αρχικής γλώσσας µε κανόνες παραγωγής για αυ-τές τις λανθασµένες συµβολοσειρές και να χρησιµοποιήσει αυτή την επαυξηµένη γραµ-µατική για να υλοποιήσει το ΣΑ. Αν κατά τη διάρκεια της συντακτικής ανάλυσης χρησι-µοποιηθεί κάποιος από τους κανόνες παραγωγής σφαλµάτων, τότε θα υποδεικνύεται µεκατάλληλο διαγνωστικό µήνυµα η λανθασµένη συντακτική δοµή που εντοπίστηκε στη

17

Page 18: Bottom Up Latex

συµβολοσειρά εισόδου. Η µέθοδος αυτή έχει το µειονέκτηµα ότι διογκώνει τη γραµµατικήτης αρχικής γλώσσας. Επιπλέον, λόγω της αναγκαστικής οµοιότητας των κανόνων πα-ραγωγής σφαλµάτων µε τους κανόνες παραγωγής της αρχικής γλώσσας, είναι δυνατόν ηεπαυξηµένη γραµµατική να µη διαθέτει τις απαραίτητες ιδιότητες για την κατασκευή τουΣΑ, π.χ. να µην είναι LL(1) ή ακόµα και να είναι διφορούµενη.

• Η καθολική διόρθωση (global correction). Χωρίς αµφιβολία, ο µεταγλωττιστής πρέπεινα κάνει όσο γίνεται λιγότερες αλλαγές στη συµβολοσειρά εισόδου κατά τη διάρκεια τηςεπεξεργασίας ενός λανθασµένου προγράµµατος. Υπάρχουν αλγόριθµοι για την επιλογήµιας ελάχιστης ακολουθίας αλλαγών που επιτρέπουν την καθολική διόρθωση του αρχι-κού προγράµµατος. Για µια γραµµατική G και µια λανθασµένη συµβολοσειρά εισόδου x,οι αλγόριθµοι αυτοί βρίσκουν ένα συντακτικό δέντρο για µια συµβολοσειρά y, τέτοια ώστεο αριθµός των απαιτούµενων εισαγωγών, διαγραφών και αντικαταστάσεων λεκτικών µο-νάδωνπου απαιτούνται για να µετασχηµατίσουµε τη x στη y να είναι ο ελάχιστος δυνατός.Δυστυχώς, αυτές οι µέθοδοι είναι γενικά πολύ δαπανηρές στην υλοποίηση τους, τόσο απόπλευράς χρόνου όσο και από πλευράς µνήµης. Για το λόγο αυτό έχουν κυρίως θεωρητικόενδιαφέρον. Επίσης, πρέπει να σηµειωθεί ότι το πρόγραµµα που προκύπτει από τις ελά-χιστες δυνατές αλλαγές µπορεί να µην είναι αυτό που ήθελε στην πραγµατικότητα ναγράψει ο προγραµµατιστής. Η µέθοδος αυτή έχει χρησιµοποιηθεί επίσης για τη βέλτιστηαντικατάσταση συµβολοσειρών σε επίπεδο φράσης.

Ανάνηψη από σφάλµατα σε συντακτικό αναλυτή LR(1)

Ένας συντακτικός αναλυτής LR(1) εντοπίζει την ύπαρξη σφάλµατος όταν προσπελάσεικάποιο στοιχείο του πινάκα ελέγχου ACTION που είναι κενό. Αντίθετα, δεν εντοπίζονταισφάλµατα κατά την προσπέλαση του πίνακα ελέγχουΝΕΧΤ. Στην περίπτωση εντοπισµούσφάλµατος, δεν υπάρχει έγκυρος τρόπος για να συνεχιστεί η συντακτική ανάλυση µε τοµέρος της εισόδου που έχει καταναλωθεί µέχρι αυτή τη στιγµή. Ένας κανονικός (canonical)ΣΑ LR(1) έχει την ιδιότητα να µην κάνει καµία ελάττωση πριν ανακοινώσει την ύπαρξησφάλµατος. Οι ΣΑ SLR(1) και LALR(1) δεν είναι κανονικοί: µπορούν να κάνουν αρκετέςελαττώσεις πριν αναφέρουν ένα σφάλµα, ποτέ όµως δε θα ολισθήσουν ένα λανθασµένοσύµβολο εισόδου στη στοίβα.

Παρακάτω περιγράφεται πώς µπορεί να υλοποιηθεί η µέθοδος πανικού σε ένα συντα-κτικό αναλυτή LR(1). Στην περίπτωση εντοπισµού σφάλµατος, ο ΣΑ αφαιρεί σύµβολα απότη στοίβα µέχρι να βρει ένα ζεύγος κατάστασης s και µη τερµατικού συµβόλου A, για ταοποία να υπάρχει έγκυρη είσοδος στο τµήµα της επόµενης κατάστασης του πίνακα συντα-κτικής ανάλυσης. Στη συνέχεια, αφαιρούνται ενδεχοµένως λεκτικές µονάδες από τη συµ-βολοσειρά εισόδου έως ότου βρεθεί ένα σύµβολο a που να ανήκει στο σύνολο FOLLOW(A).Τότε, ο ΣΑ βάζει στη στοίβα την κατάσταση ΝΕΧT(s,A) και συνεχίζει κανονικά τ η συντα-κτική ανάλυση.

Αυτή η µέθοδος ανάνηψης επιχειρεί να αποµονώσει τη φράση που περιέχει το συντα-κτικό σφάλµα. Ο ΣΑ αποφασίζει πως µια συµβολοσειρά που παράγεται από το µη τερµα-τικό A περιέχει σφάλµα. Ένα µέρος από αυτή τη συµβολοσειρά το έχει ήδη επεξεργαστείκαι το αποτέλεσµα αυτής της επεξεργασίας είναι µια ακολουθία ζευγών στην κορυφή τηςστοίβας. Το υπόλοιπο της συµβολοσειράς είναι ακόµη στην είσοδο και ο ΣΑ επιχειρεί νατο ξεπεράσει, ψάχνοντας για µια λεκτική µονάδα που να µπορεί νόµιµα να ακολουθήσειτο FOLLOW(A). Βγάζοντας την ακολουθία ζευγών από τη στοίβα, πετώντας το υπόλοιπο

18

Page 19: Bottom Up Latex

της εισόδου και βάζοντας στη στοίβα την κατάσταση ΝΕΧT(s,A), ο ΣΑ θεωρεί ότι έχει ανα-γνωρίσει ένα στιγµιότυπο του A και συνεχίζει κανονικά τη συντακτική ανάλυση.

Η στρατηγική ανάνηψης σε επίπεδο φράσης υλοποιείται σε ένα ΣΑ LR(1) εξετάζονταςκάθε κενή θέση στον πίνακα ελέγχου ΑCΤΙΟΝ και αποφασίζοντας, βάσει της αρχικήςγλώσσας, ποιο είναι το πιο κοινό σφάλµα του προγραµµατιστή που µπορεί να οδηγήσεισε αυτή τη θέση. Με τον τρόπο αυτό µπορεί να σχεδιαστεί για κάθε ένα από αυτά µιακατάλληλη διαδικασία ανάνηψης. Έτσι, στις κενές θέσεις του πίνακα ΑCΤΙΟΝ τοποθετού-νται δείκτες σε ρουτίνες χειρισµού σφαλµάτων, κάθε µια από τις οποίες µπορεί να εισάγει,να διαγράφει σύµβολα, να αλλάζει ή να αντιµεταθέτει σύµβολα από τη στοίβα ή και απότην είσοδο. Οι τροποποιήσεις αυτές πρέπει να γίνονται χωρίς να επιτρέπεται στον ΣΑ ναυποπέσει σε ατέρµονα κύκλο. Αυτό εξασφαλίζεται αν είναι υποχρεωτικό κάθε φορά νααποµακρύνεται ή να ολισθαίνει µια λεκτική µονάδα από τη συµβολοσειρά εισόδου.

19


Recommended