Top Down Bottom Up Συντακτική Ανάλυση Γιώργος Μανής δεοµένης της παραγωγής X αβ, ο συµβολισµός X α β αναπαριστά µία κατάσταση στη οποία το α έχει ήδη αναγνωριστεί και το β προσδοκάται να αναγνωριστεί. Οσυµβολισµός X α β, i σηµαίνει ότι η παραγωγή που αναγνωρίζεται είναι η (X αβ) έχει ήδη αναγνωριστεί µέχρι τη θέση που βρίσκεται η τελεία η αναγνώριση έχει ξεκινήσει από το σηµεί i της ακολουθίας εισόδου Ο συντακτικός αναλυτής πραγµατοποιεί τρεις κινήσεις Prediction: Για κάθε κατάσταση που ανήκει στο σύνολο καταστάσεων S(k) που έχει τη µορφή (X α Y β, j) πρόσθεσε το (Y γ, k) στο S(k) για κάθε κανόνα που έχει το Y στο αριστερό του µέλος. Scanning: Εάν το a είναι το επόµενο σύµβολο στην ακολουθία εισόδου, για κάθε κατάσταση που ανήκει στο σύνολο S(k) και έχει τη µορφή (X α a β, j), πρόσθεσε το (X α a β, j) στο σύνολο καταστάσεων S(k+1). Completion: Για κάθε κατάσταση του S(k) που έχει τη µορφή (X γ, j), βρες τις καταστάσεις του S(j) που έχουν τη µορφή (Y α X β, i) και πρόσθεσε το (Y α X β, i) στο S(k). Θεωρούµε τηγραµµατική : P S S S + M S M M M * T M T T number µε είσοδο: 2 + 3 * 4 1
Συµφραζόµενα (bottom up - CYK) εξετάζει κάθε πιθανή υποακολουθία µιας ακολουθίας λέξεων για να βρει υποσυµβολοσειρές που ξεκινούν από ένα σηµείο i και έχουν µήκος ξ και µπορούν να παραχθούν από τον κανόνα Rk. αρχικά ξεκινάει µε j=1 και µετά συνεχίζει για j=2 κ.ο.κ για j=2 και µεγαλύτερο θεωρεί κάθε πιθανό διαχωρισµό της υποακολουθίας σε δύο τµήµατα και ελέγχει να δει έαν κάποια παραγωγή P Q R τέτοια ώστε το Q ταιριάζει µε τοπρώτοµέρος και το R µε τοδεύτερο. Επιτυχής αναγνώριση υπάρχει όταν ταιριάξει η συµβολοσειρά εισόδου µε τοαρχικόσύµβολο της γραµµατικής Συµφραζόµενα (bottom up - CYK) Συντακτική Ανάλυση για Γραµµατικές µε Συµφραζόµενα S -> XY X -> YX Y -> ZX Z -> ZY X -> a Y -> b Z -> a X -> c Z -> d 1 begin 2 Ι := { S } 3 D := 4 while Ι do begin 5 Ι := Ι y, y Ι, y = 1 6 R := { x x : y e x, y e y, x A } 7 if A R then SUCCESS 8 else begin 9 x R, x I, x D, Ι := I { x } 10 end 11 D := D { y } 12 end 13 FAIL 14 end Συντακτική Ανάλυση για Γραµµατικές µε Συµφραζόµενα Το Σύνολο FIRST S abc S asq bqc bbcc cq Qc Ταίριασµα Αρχικά S µε S abc, S asq asq µε S abc, S asq aasqq µε aabcq µε cq Qc Στοιχεία που προστίθενται στο Ι S abc, asq abc, aabcq, aasqq abc, aabcq abc, aabqc D S S, asq S, asq, aasqq S, asq, aasqq, aabcq Έστω η γραµµατική G=(T,N,P,S) και α є (ΤUΝ)* το σύνολο FIRST(a) T U {ε} ορίζεται ως εξής: αν υπάρχει δυνατή παραγωγή της µορφής α * cβ, µε cєt και βє(τuν)* τότε cєfirst(a) αν υπάρχει δυνατή παραγωγή της µορφής α * ε, τότε εєfirst(a) µε άλλα λόγια το FIRST(α) περιέχει όλα τα τερµατικά σύµβολα µετα οποία είναι δυνατόν να αρχίζουν οι συµβολοσειρές που παράγονται από το α. Αν η α παράγει την κενή συµβολοσειρά, τότε το σύνολο FIRST(α) περιέχει και το ε aabqc µε bqc bbcc aabbcc S, asq, aasqq, aabcq, aabqc 2
Το Σύνολο FOLLOW FIRST και FOLLOW παράδειγµα Έστω η γραµµατική G=(T,N,P,S) και A є N το σύνολο FOLLOW(A) T U {eof} ορίζεται ως εξής: αν υπάρχει δυνατή παραγωγή της µορφής S * aacβ, µε cєt και a,βє(τuν)* τότε cєfollow(α) αν υπάρχει δυνατή παραγωγή της µορφής S * aa, aє(τuν)* τότε eofєfollow(α) µε άλλα λόγια το FOLLOW(Α) περιέχει όλα τα τερµατικά σύµβολα τα οποία µπορούν να ακολουθούν το Α σε ένα προτασιακό τύπο. Αν το Α µπορεί να είναι το τελευταίο σύµβολο σε ένα προτασιακό τύπο, τότε το σύνολο FOLLOW(A) περιέχει και το eof Ε -> ΤΕ Ε -> ε Ε -> + ΤΕ Τ -> F T T -> ε Τ ->* F Τ F -> ( E ) F -> id FIRST(E )= { +, ε } FIRST(Τ )= { *, ε } FIRST(F)= { id, ( } FIRST(E)=FIRST(T)=FIRST(F)={ id, ( } FOLLOW(E) = { eof, ) } FOLLOW(T) = FIRST(E ) U FOLLOW(E) U FOLLOW(E ) = = { eof, ), + } FOLLOW(E ) = FOLLOW(E) = { eof, ) } FOLLOW(T ) = FOLLOW(T) = { eof, ), + } FOLLOW(F) = FIRST(T ) U FOLLOW(T ) = = { *, eof, ), + } Γραµµατική LL(1) Γραµµατικές LL(1) τεχνικές που χρησιµοποιούνται για τη µετατροπή γραµµατικών σε LL(1) Αν Α->α και Α->β δύο διαφορετικοί κανόνες της γραµµατικής τότε θα πρέπει FIRST(a)IFIRST(β)=Ø αντικατάσταση A -> a 1 a 2 a n B -> β 1 Αβ 2 Αν Α->ε κανόνας της γραµµατικής τότε θα πρέπει FIRST(Α)IFOLLOW(A)=Ø δίνει A -> a 1 a 2 a n Β -> β 1 a 1 β 2 β 1 a 2 β 2 β 1 a n β 2 αριστερή παραγοντοποίηση απαλοιφή έµµεσης και άµεσης αναδροµής Γραµµατικές LL(1) Γραµµατικές LL(1) τεχνικές που χρησιµοποιούνται για τη µετατροπή γραµµατικών σε LL(1) αντικατάσταση αριστερή παραγοντοποίηση Α -> αβ 1 αβ 2 αβ n δίνει Α -> αβ Β -> β 1 β 2 β n απαλοιφή έµµεσης και άµεσης αναδροµής τεχνικές που χρησιµοποιούνται για τη µετατροπή γραµµατικών σε LL(1) αντικατάσταση αριστερή παραγοντοποίηση απαλοιφή έµµεσης και άµεσης αναδροµής Α -> Aα 1 Aα 2 Aα n β 1 β 2 β m δίνει A -> β 1 B β 2 B β m B B-> α 1 B α 2 B α n B ε 3
Συντακτικοί Αναλυτές Αναδροµικής Κατάβασης Συντακτικός Αναλυτής LL(1) για κάθε µη τερµατικό σύµβολο υλοποιείται µία συνάρτηση όταν συναντάται µη τερµατικό σύµβολο στη γραµµατική καλείται η αντίστοιχη συνάρτηση όταν συναντείται τερµατικό σύµβολο στη γραµµατική πρέπει να υπάρχει και το αντίστοιχο σύµβολο στη συµβολοσειρά εισόδου περισσότερο αναλυτικά παρουσιάζεται η αναδροµική κατάβαση στις διαφάνειες του µαθήµατος «Μεταφραστές» Κατασκευή πίνακα συντακτικής ανάλυσης LL(1) ΓιακάθεκανόναΑ-> α καιγιακάθετερµατικό σύµβολο b που ανήκει στο FIRST(a) πρόσθεσε τον κανόνα Α -> α στηθέσημ(α,b) ΓιακάθεκανόναΑ-> α καιεάνανήκειτοεστοfirst(a) τότε για κάθε τερµατικό σύµβολο b που ανήκει στο FOLLOW(a) πρόσθεσε τον κανόνα Α -> α στηθέσημ(α,b) Συντακτικός Αναλυτής LL(1) Συντακτικός Αναλυτής LL(1) Ε -> ΤΕ Ε -> ε Ε -> + ΤΕ Τ -> F T T -> ε Τ ->* F Τ F -> ( E ) F -> id E id E->TE FIRST(E )= { +, ε } FIRST(Τ )= { *, ε } FIRST(E)=FIRST(T)=FIRST(F)={ id, ( } FOLLOW(E ) = FOLLOW(E) = { eof, ) } FOLLOW(T ) = FOLLOW(T) = { eof, ), + } FOLLOW(F) = { *, eof, ), + } + * ( ) E->TE eof Αν στην κορυφή της στοίβας βρίσκεται το τερµατικό σύµβολο α και το επόµενο σύµβολο της συµβολοσειράς εισόδου είναι το α τότε το α αφαιρείται από τη στοίβα και καταναλώνεται από τη συµβολοσειρά εισόδου Αν στην κορυφή της στοίβας βρίσκεται το µη τερµατικό σύµβολο Α και το επόµενο σύµβολο της συµβολοσειράς εισόδου είναι το α και το Μ(Α,α) περιέχει τον κανόνα Α->β τότε το Α αφαιρείται από τη στοίβα και τοποθετούνται εκεί τα σύµβολα που αποτελούν τη συµβολοσειρά β µε αντίστροφη σειρά Αν κανένα από τα παραπάνω δεν µπορεί να εφαρµοστεί τότε υπάρχει συντακτικό σφάλµα E T T T->FT E ->+TE T ->ε T ->*FT T->FT E ->ε T ->ε E ->ε T ->ε Αν αδειάσει η στοίβα και δεν έχει εξαντληθεί η συµβολοσειρά εισόδου τότε έχουµε συντακτικόσφάλµα Αν αδειάσει η στοίβα και έχει εξαντληθεί η συµβολοσειρά εισόδου τότε έχουµε επιτυχή αναγνώριση F F->id F->(E) Συντακτικός Αναλυτής LR(1) Συντακτική Ανάλυση LR Μπορούν να αναγνωρίσουν οι γλώσσες που περιγράφονται από τις ακόλουθες γραµµατικές LR(0): δεν απαιτεί προεπισκόπηση λεκτικών µονάδων αλλά είναι αρκετά περιοριστική περιγραφή χωρίς πρακτική αξία SLR(1): περιγράφει µεγαλύτερο εύρος γλωσσών µε επίσης µικρή πρακτική αξία LALR(1): χρησιµοποιείται περισσότερο στην πράξη µε εκφραστική ισχύ ανάµεσα στις SLR(1) και LR(1). Χρησιµοποιείται από εργαλεία αυτόµατης µετάφρασης LR(1): µπορεί να περιγράψει πολλές γλώσσες όµως δηµιουργεί µεγάλους πίνακες ελέγχου κάτι που κάνει απαγορευτική τη χρήση του 4
Στοιχείο (item) στον κανόνα Α->xy αντιστοιχούν τρία στοιχεία Α->.xy Α->x.y CLOSURE(I) I CLOSURE(I) Αν το Α->α.Ββ ανήκει στο CLOSURE(I) και υπάρχει κανόνας της µορφής Β->γ τότε και το στοιχείο Β->.γ ανήκειεπίσηςστοclosure(i) Α->xy. το στοιχείο Α->x.y σηµαίνει ότι έχει αναγνωριστεί µέχρι στιγµής το x και αναµένεται να αναγνωριστεί το y Έστω η γραµµατική S->rB B->D B->B,D D->a D->b και το Ι = { S->r.B } Το σύνολο GOTO(I,x) περιέχει όλα τα στοιχεία της γραµµατικής που µπορούν να προκύψουν από τα στοιχεία το Ι, αν αναγνωριστεί το σύµβολο x Έστω η ίδια γραµµατική και I = { B->.D B->.B,D } τότε GOTO(I,B)= { B->B.,D } τότε CLOSURE(I) = { S->r.B B->.D B->.B,D D->.a D->.b } Ιο = { S ->.S S->.rB } Έστω η γραµµατική S ->S S->rB B->D B->B,D D->a D->b θα βρούµε το σύνολο καταστάσεων και θα κατασκευάσουµε τον πίνακα ελέγχου GOTO(Io,S) = I 1 = { S ->S. } GOTO(Io,r) = I 2 ={ S->r.B B->.B,D B->.D D->.a D->.b } GOTO(I 2,B) = I 3 = { S->rB. B->B.,D } GOTO(I 2,D) = I 4 = { B->D. } GOTO(I 2,a) = I 5 = { D->a. } GOTO(I 2,b) = I 6 = { D->b. } GOTO(I 3,, ) = I 7 = { B->B,.D D->.a D->.b } GOTO(I 7,D) = I 8 = { B->B,D. } GOTO(I 7,a) = { D->a. } GOTO(I 7,b) = { D->b. } 5
r, a b eof 0 s2 1 r0 2 s5 s6 3 s7 r1 4 r2 r2 5 r4 r4 6 r5 r5 7 s5 s6 8 r3 S s1 B s3 D s4 s8 Parsing Algorithm: Initialize the stack with S Read input symbol while (true) if Action(top(stack), input) = S NS <- Goto(top(stack),input) push NS Read next symbol else if Action(top(stack), input) = Rk output k pop RHS of production k from stack NS <- Goto(top(stack), LHS_k) push NS else if Action(top(stack),input) = A output valid, return else output invalid, return Συντακτική Ανάλυση SLR(1) και LR(1) 0 Στοίβα Είσοδος ra,b$ Κίνηση s2 Βασικές αδυναµίες συντακτικής ανάλυσης SLR(1) χρησιµοποιούµε τοσύνολοfollow γιαναπάρουµε απόφαση ποιον κανόνα 0r2 a,b$ s5 θα ακολουθήσουµε 0r2a5,b$ r4 το σύνολο FOLLOW παράγεται από πολλούς κανόνες 0r2D4,b$ r2 Βασική ιδέα συντακτικής ανάλυσης LR(1) 0r2B3 0r2B3,7 0r2B3,7b6,b$ b$ $ s7 s6 r5 αν διατηρούσαµε την πληροφορία ποιος κανόνας έβαλε ποιο σύµβολο µέσα στο FOLLOW τότε θα µπορούσαµε νακάνουµε καλύτερη πρόβλεψη για το ποιος κανόνας πρέπει να ελαττωθεί (reduced) η πληροφορία αυτή θα κρατείται κατά την κατασκευή του συνόλου 0r2B3,7D8 $ r3 CLOSURE 0r2B3 $ r1 0S1 $ r0=acc Έστω η γραµµατική Ε -> Ε + (Ε) Ε -> int και το στοιχείο Ε -> Ε + (.Ε) όταν προσθέτουµε στο CLOSURE τα Ε ->.Ε + (Ε) Ε ->.int σηµειώνουµε ότι το αρχικό Ε ακολουθείται από ) και τα στοιχεία γίνονται Ε ->.Ε + (Ε), ) Ε ->.int, ) Στοιχείο LR(1) X -> a.β, c X -> aβ µία παραγωγή c τερµατικό σύµβολο (το επόµενο σύµβολο lookahead) αναζητούµε κάποιο Χ ακολουθούµενο από c υπάρχει κάποιο c στην κορυφή της στοίβας άρα αναζητούµε τώρα να αγνωρίσουµε βc 6
τροποποιούµε τηγραµµατική προσθέτοντας τον κανόνα S -> E και αναζητούµε S ->.E, $ δηλαδή ένα Ε να ακολουθείται από eof Ο νέος τρόπος κατασκευής του CLOSURE Οι LR(1) καταστάσεις Οαριθµός των LR(1) καταστάσεων είναι απαγορευτικά µεγάλος οι LALR(1) είναι συνήθως 10 φορές λιγότερες από τις LR(1) σε µία προσπάθεια να τον µειώσουµε συνενώνουµε παρόµοιες καταστάσεις µε τησυνένωσηαυτήχάνουµεπληροφορία άρα και περιγραφική ικανότητα µπορούν να συνενωθούν στις LALR(1) καταστάσεις 7
8
Συγκρούσεις Συγκρούσεις Επίλυση Συγκρούσεων µε το Εργαλείο Yacc 9