1.21k likes | 1.33k Views
Γραμματικές Ι. Γραμματικές ΙΙ. Γραμματικές ΙΙΙ. Γραμματικές Ι V. Γραμματικές V. Γραμματικές και συντακτική ανάλυση Ι. Έστω, η γραμματική χωρίς συμφραζόμενα Γ= ( Τ,Ν, S,R), όπου Τ={ NUMBER ,+,-,*,/,(,)} N={E} S=E με κανόνες παραγωγής: E E+E (1) | E-E (2) | E*E (3) | E/E (4)
E N D
Γραμματικές Ι Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές ΙΙ Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές ΙΙΙ Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές ΙV Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές V Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές και συντακτική ανάλυση Ι Έστω, η γραμματική χωρίςσυμφραζόμενα Γ=(Τ,Ν,S,R), όπουΤ={NUMBER,+,-,*,/,(,)} N={E} S=E με κανόνες παραγωγής: EE+E (1) | E-E (2) | E*E (3) | E/E (4) | (E) (5) | NUMBER (6) Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές και συντακτική ανάλυση ΙΙ Η παραπάνω γραμματική μπορεί να αναλύσει την παράσταση (3+7)/(8-6). Πρώτα χρησιμοποιεί τον κανόνα παραγωγής (4) καισχηματίζει το δένδρο: Μετά σχηματίζει το αριστερό και το δεξί υποδένδρο χρησιμοποιώντας τον κανόνα παραγωγής (5): Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές και συντακτική ανάλυση ΙΙΙ Η ανάλυση συνεχίζει με τα φύλλα Ε στα δύο υποδένδρα. Το Ε στο αριστερό υποδένδρο αναλύεται με τον κανόνα παραγωγής (1) και το Ε στο δεξί υποδένδρο αναλύεται με τον κανόνα παραγωγής (2). Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές και συντακτική ανάλυση ΙV Τέλος όλα τα φύλλα Ε αναλύονται με τον κανόνα παραγωγής (6). Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές και συντακτική ανάλυση V Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές και συντακτική ανάλυση VI Το αποτέλεσμα της ανάλυσης είναι ένα παράγωγο δένδρο. Όταν η ανάλυση προχωράει πάντα πρώτα με το σχηματισμό των αριστερών υποδένδρων, τότε λέμε ότι η ανάλυση σχηματίζει αριστερές προτασιακές μορφές. • Λέμε ότι η συμβολοσειρά είναι μια αριστερή προτασιακή μορφή, αν έχει προκύψει από τις προηγούμενες, εφαρμόζοντας κάθε φορά παραγωγή, που αντικαθιστά το πρώτο μη τερματικό σύμβολο από αριστερά. Αυτό γράφεται ως, • Μια συμβολοσειρά είναι δεξιά προτασιακή μορφή, αν έχει προκύψει εφαρμόζοντας κάθε φορά παραγωγή, που αντικαθιστά το πρώτο μη τερματικό σύμβολο από δεξιά. Αυτό γράφεται ως Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές και συντακτική ανάλυση VII • Λέμε ότι μια γραμματική είναι γραμματική LL(k) αν κάθε της πρόταση μπορεί να προέλθει από την αρχή της μέσω αριστερών προτασιακών μορφών, όπου ο κανόνας που εφαρμόζεται σε κάθε παραγωγή μπορεί να προβλεφθεί με βάση τα k επόμενα σύμβολα της συμβολοσειράς. • Όλες οι γλώσσες της οικογένειας LL είναι προσδιοριστικές. • Μια γραμματική είναι γραμματική LR(k) αν κάθε της πρόταση μπορεί να παραχθεί από την αρχή της μέσω δεξιών προτασιακών μορφών, που προκύπτουν με εφαρμογή κανόνα ο οποίος μπορεί να ανιχνευθεί με βάση τα k πρώτα τερματικά σύμβολα της προτασιακής μορφής. • Όλες οι γλώσσες της οικογένειας LR είναι προσδιοριστικές. • Η οικογένεια των γλωσσών LR(1) είναι ακριβώς η οικογένεια των προσδιοριστικών γλωσσών και είναι ευρύτερη από την οικογένεια των γλωσσών LL. Τμ. Πληροφορικής, Α.Π.Θ.
Συμβολισμοί BNF και EBNF I Τμ. Πληροφορικής, Α.Π.Θ.
Συμβολισμοί BNF και EBNF II ΠΑΡΑΔΕΙΓΜΑ: Γραμματική αριθμητικών εκφράσεων S = έκφραση. έκφραση = έκφραση “+” όρος | έκφραση “-” όρος | όρος. όρος = όρος “*” παράγοντας | όρος “/” παράγοντας | παράγοντας. παράγοντας = “(” έκφραση “)” | αριθμός. αριθμός = ψηφίο { ψηφίο }. ψηφίο = “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9”. Τμ. Πληροφορικής, Α.Π.Θ.
Παράγωγα και συντακτικά δένδρα I • Ένα παράγωγο δένδρο αναπαριστά τη δομή μιας πρότασης και έχει το χαρακτηριστικό ότι μπορεί να αντιστοιχεί σε περισσότερες από μία παραγωγές. ΠΑΡΑΔΕΙΓΜΑ S = έκφραση. έκφραση = έκφραση ΤΛ έκφραση | “(” έκφραση “)” | “αριθμός”. ΤΛ = “+” | “-” | “*” | “/”. ΠΡΌΤΑΣΗ: (27-5)*8 Τμ. Πληροφορικής, Α.Π.Θ.
Παράγωγα και συντακτικά δένδρα II Παραγωγή μέσω δεξιών προτασιακών μορφών Παραγωγή μέσω αριστερών προτασιακών μορφών Τμ. Πληροφορικής, Α.Π.Θ.
Παράγωγα και συντακτικά δένδρα IIΙ Τμ. Πληροφορικής, Α.Π.Θ.
Παράγωγα και συντακτικά δένδρα IV Συντακτικό δένδρο: πιο συμπαγής δομή που παράλληλα περιέχει και την πληροφορία για τη στατική σημασία της πρότασης Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες Ι • Λέμε ότι μια γραμματική περιέχει ασάφειες, όταν σε μια πρότασή της μπορεί να αντιστοιχούν περισσότερα από ένα δένδρα. ΑΣΑΦΕΙΑ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΤΕΛΕΣΤΩΝ S = έκφραση. έκφραση = έκφραση ΤΛ έκφραση | “(” έκφραση “)” | “αριθμός”. ΤΛ = “+” | “-” | “*” | “/”. ΠΡΟΤΑΣΗ: 27-5*8 Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες ΙΙ Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες ΙΙΙ Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες ΙV • Σωστό δένδρο είναι το δένδρο εκείνο που είναι συμβατό με τη σημασία που θέλει να αποδώσει ο κατασκευαστής σε κάθε στοιχείο της γλώσσας. • Για την ασάφεια προτεραιότητας τελεστών απαιτείται η χρήση κανόνων αποσαφήνισης προτεραιοτήτων. S = έκφραση. έκφραση = έκφραση ΤΛ_ΑΘ έκφραση | όρος. ΤΛ_ΑΘ = “+” | “-”. όρος = όρος ΤΛ_ΓΙ όρος | παράγοντας. ΤΛ_ΓΙ = “*” | “/”. παράγοντας = “(” έκφραση “)” | “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες V • Η προηγούμενη γραμματική παραμένει δέσμια ασάφειας ως προς την προσεταιριστικότητα των πράξεων: πως γίνεται η ανάλυση της 27-5-8; Η συγκεκριμένη γραμματική αφήνει ανοικτό και το ενδεχόμενο (27-5)-8 αλλάκαι το ενδεχόμενο 27-(5-8). • Συνήθως μας ενδιαφέρει να διασφαλίζουμε αριστερή προσεταιριστικότητα και αυτό επιτυγχάνεται αν ο αντίστοιχος κανόνας της γραμματικής χαρακτηρίζεται από αριστερή και μόνο αριστερή αναδρομικότητα. Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες VΙ Διορθωμένη γραμματική:S = έκφραση. έκφραση = έκφραση ΤΛ_ΑΘ όρος | όρος. ΤΛ_ΑΘ = “+” | “-”. όρος = όρος ΤΛ_ΓΙ παράγοντας | παράγοντας. ΤΛ_ΓΙ = “*” | “/”. παράγοντας = “(” έκφραση “)” | “αριθμός”. Πρόταση:27-5*8 Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες VΙΙ Πρόταση:27-5-8 Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες VΙΙI ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΜΕΤΕΩΡΟΥ ELSE S = εντολή. εντολή = “if” έκφραση “then” εντολή | “if” έκφραση “then” εντολή “else” εντολή | άλλο. if EK1 then if EK2 then ΕΝΤ1 else ΕΝΤ2 Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες IΧ Τμ. Πληροφορικής, Α.Π.Θ.
Γραμματικές με ασάφειες Χ ΓΡΑΜΜΑΤΙΚΗ ΠΟΥ ΑΠΟΦΕΥΓΕΙ ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΜΕΤΕΩΡΟΥ ELSE ΜΕ ΤΕΧΝΑΣΜΑ S = εντολή. εντολή = συν_εντολή | ασυν_εντολή. συν_εντολή=“if” έκφραση “then” συν_εντολή “else”συν_εντολή | άλλο. ασυν_εντολή= “if” έκφραση “then” εντολή |“if” έκφραση “then” συν_εντολή “else” ασυν_εντολή. Τμ. Πληροφορικής, Α.Π.Θ.
Αναπαράσταση παράγωγου δένδρου #define astEmptyProgram 399 #define astProgram 400 #define astEmptyDeclSeq 401 #define astDeclSeq 402 #define astDecl 403 . . . . . . . . . . . . . . /* ----------------------------------------------------------- */ /* ----- THE STRUCTURE FOR THE ABSTRACT SYNTAX TREE NODES ---- */ /* ----------------------------------------------------------- */ typedef struct AstNode_tag { int NodeType; struct symbol_tag *SymbolNode; struct AstNode_tag *pAstNode[4]; } AstNode; Τμ. Πληροφορικής, Α.Π.Θ.
Καθοδική Ανάλυση • Ξεκινά από τη αρχή της γραμματικής (ρίζα δένδρου) για να αναπτύξει τη συμβολοσειρά, που αναλύει, αν αυτή αποτελεί πρόταση. • Καμία από τις τεχνικές που θα εξετάσουμε δεν μπορεί να εφαρμοσθεί σε αριστερά αναδρομικές γραμματικές. • Διακρίνουμε της τεχνικές της οπισθοδρόμησης και τις τεχνικές της πρόγνωσης. Τμ. Πληροφορικής, Α.Π.Θ.
Καθοδική ανάλυση με οπισθοδρόμηση Ι • Δοθέντος συγκεκριμένου μη τερματικού συμβόλου εφαρμόζεται ο πρώτος κανόνας της γραμματικής. • Στην προτασιακή μορφή, που προκύπτει επιλέγεται το πρώτο από αριστερά μη τερματικό σύμβολο και εφαρμόζεται ο πρώτος κανόνας, που αναφέρεται σε αυτό. • Γίνεται επαναληπτική εφαρμογή του βήματος 2, για κάθε ένα από τα μη τερματικά σύμβολα, που ακολουθούν, μέχρι τη στιγμή της παραγωγής, • μιας σειράς τερματικών συμβόλων (πρόταση γλώσσας αν ταυτίζεται) ή • τμήματος τερματικών συμβόλων της προτασιακής μορφής, που διαφέρει από το αντίστοιχο τμήμα της συμβολοσειράς εισόδου Η δεύτερη περίπτωση μπορεί να είναι αποτέλεσμα εσφαλμένης επιλογής κανόνα. Αναιρείται ο κανόνας που εφαρμόσθηκε τελευταίος και χρησιμοποιείται ο επόμενος που ισχύει για το ίδιο μη τερματικό σύμβολο. Αν έχουν χρησιμοποιηθεί όλοι οι κανόνες, τότε ο αλγόριθμος διατηρεί το σύμβολο ως έχει και προχωρά στην αναίρεση του κανόνα για το προηγούμενο μη τερματικό σύμβολο και οπισθοδρομεί στην κατάλληλη θέση της συμβολοσειράς εισόδου. Τμ. Πληροφορικής, Α.Π.Θ.
Καθοδική ανάλυση με οπισθοδρόμηση ΙΙ ΠΑΡΑΔΕΙΓΜΑ S = “k” X “n” | “k” Y. X = “l” | “m”. Y = “mmn” | “nnm”.ΠΡΟΤΑΣΗ:“kmmm” Τμ. Πληροφορικής, Α.Π.Θ.
Καθοδική ανάλυση με οπισθοδρόμηση ΙΙ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 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();} } 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; } } Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης 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 L() { switch(lookahead) { case END: match(END); break; case SEMI: match(SEMI); S(); L(); break; default: error(); } } void S() { switch(lookahead) { case IF: match(IF); E(); match(THEN); S(); match(ELSE); S(); break; case BEGIN: matvh(BEGIN); S(); L(); break; case PRINT: match(PRINT); E(); break; default: error(); } } void E() { match(NUM); match(EQ); match(NUM); } Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης Χ main: κλήση S(); S1: εφαρμογή της παραγωγής (S, IF) : SifE thenSelse S S1: match(IF); S1: κλήση E(); E1: εφαρμογή της παραγωγής για (E, NUM): Enum = num E1: match(NUM); match(EQ); match(NUM); E1: return για E1στο S1 S1: match(THEN); S1:κλήση S(); S2: εφαρμογή της παραγωγής για (S, PRINT): Sprint E S2: match(PRINT); S2: κλήση E(); E2: εφαρμογή της παραγωγής για (E, NUM): Enum = num E2: match(NUM); match(EQ); match(NUM); E2: return για E2στο S2 S2: return για S2στο S1 S1: match(ELSE); S1: κλήση S(); S3: εφαρμογή της παραγωγής για (S, PRINT): SprintE S3: match(PRINT); S3: κλήση E(); E3: εφαρμογή της παραγωγής για (E, NUM): Enum = num E3: match(NUM); match(EQ); match(NUM); E3: return για E2στο S3 S3: return για S3στο S1 S1: return για S1στο main main: match(EOF); return success; Άλλο παράδειγμα (συνέχεια) πρόταση: if 2=2 then print 5=5 else print 1=1 Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙ Γενική μορφή διαδικασιών προβλέπουσας αναδρομικής κατάβασης Αν για το μη τερματικό σύμβολο Χ ορίζεται στη γραμματική ο κανόνας και αν υποθέσουμε ότι η είναι απαλείψιμη, τότε Χ: Επέλεξε ΛΕΞ_ΜΟΝ περιπτώσεις FIRST( ): διαδικασίες αναγνώρισης περιπτώσεις FIRST( ): διαδικασίες αναγνώρισης .... περιπτώσεις FIRST( ) FOLLOW(X): διαδικασίες αναγνώρισης ή των συμβόλων που ακολουθούν αλλιώς λάθος; Τέλος Χ. Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙΙ ΣΥΝΟΛΑ FIRSTΓΙΑ ΣΥΜΒΟΛΑ ΓΡΑΜΜΑΤΙΚΗΣ Για μία σειρά συμβόλων της γραμματικήςορίζουμεFIRST() ως το σύνολο των αναγνωριστικών που εμφανίζονται στην αρχή των συμβολοσειρών που παράγονται από την Για να υπολογίσετε τοFIRST(X) για ένα σύμβολοX, εφαρμόζετε τους επόμενους κανόνες μέχρι όταν δεν προστίθενται πλέον στοFIRST(X) νέα σύμβολα Αν τοXείναι τερματικό, τότεFIRST(X) είναι το {X} Αν υπάρχει παραγωγήX τότε το περιλαμβάνεται στοFIRST(X) Αν τοXείναι μη τερματικό καιX Y1Y2 ... Ykείναι μια παραγωγή,τότε συμπεριλαμβάνουμε στο FIRST(X) κάθε στοιχείο τουFIRST(Y1) εκτός από το Αν τοX είναι μη τερματικό καιX Y1Y2 ... Ykείναι μια παραγωγή, τότε συμπεριλαμβάνουμε το τερματικόaστοFIRST(X) αν τοaείναι στοFIRST(Yi) καιείναι σταFIRST(Yj) για όλα τα 1 j i ΑνX είναι ένα μη τερματικό καιX Y1Y2 ... Ykμια παραγωγή, τότε συμπεριλαμβάνουμε τοστοFIRST(X) αν τοείναι σταFIRST(Yi) για όλα 1 i k Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙΙΙ ΣΥΝΟΛΑ FIRSTΓΙΑ ΣΕΙΡΕΣ ΣΥΜΒΟΛΩΝ ΤΗΣ ΓΡΑΜΜΑΤΙΚΗΣ Για να υπολογίσουμε το σύνολοFIRSTγια μία σειρά X1X2 ... Xnσυμβόλων της γραμματικής (εφόσον έχουμε υπολογίσει τα σύνολα FIRSTγια τα X1, Χ2 , ... ,Xn) εφαρμόζουμε τα ακόλουθα: Το FIRST(X1X2 ... Xn) θα περιλαμβάνει: • Όλα τα σύμβολα τουFIRST(X1) εκτός από το • Όλα τα σύμβολα τουFIRST(Xi) εκτός από το, αν το είναι σταFIRST(Xj) για όλα τα 1 j i • και το , αν είναι σταFIRST(Xi)για όλα τα 1 i n Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙV ΠΑΡΑΔΕΙΓΜΑ ΥΠΟΛΟΓΙΣΜΟΥ ΣΥΝΟΛΩΝ FIRST S= έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = “+” όρος υπ_όροι | “-” όρος υπ_όροι | ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = “*” παράγοντας υπ_παραγ | “/” παράγοντας υπ_παραγ | ε. παράγοντας = “(”έκφραση “)” | “αριθμός”. Σύμβολα FIRST Σύμβολα FIRST Συμβ/ρέςFIRST S {“(”, “αριθμός”}παράγοντας{“(”, “αριθμός”}“+” όρος υπ_όροι{“+”} έκφραση{“(”, “αριθμός”} αριθμός {“αριθμός”}“-” όρος υπ_όροι{“-”} υπ_όροι { , “+”, “-” }“+” {“+”}“*” παράγοντας υπ_παραγ{“*”} όρος{“(”, “αριθμός”} “-” {“-”}“/” παράγοντας υπ_παραγ {“/”} υπ_παραγ { , “*”, “/” } “*” {“*”} “/” {“/”} “(” {“(”} Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧV ΣΥΝΟΛΑ FOLLOWΓΙΑ MH ΤΕΡΜΑΤΙΚΑ ΣΥΜΒΟΛΑ ΓΡΑΜΜΑΤΙΚΗΣ Για ένα μη τερματικό σύμβολο A ορίζουμε το FOLLOW(A) ως το σύνολο των τερματικών που μπορούν να εμφανισθούν δεξιά του A σε κάποια προτασιακή μορφή Για τον υπολογισμό τωνFOLLOW(A) για ένα μη τερματικόA εφαρμόζουμε τους κανόνες που ακολουθούν μέχρι όταν δεν προστίθενται πλέον νέα σύμβολα στοFOLLOW(A) • Εισάγουμε το$στοFOLLOW(S) ($είναι το τέλος συμβολοσειράς, Sείναι η αρχή της γραμματικής) • Αν υπάρχει παραγωγήA B , τότε περιλαμβάνουμε στο FOLLOW(B) όλα τα σύμβολα τουFIRST() εκτός του • Αν υπάρχει παραγωγήA B, τότε περιλαμβάνουμε στο FOLLOW(B) όλα τα σύμβολα τουFOLLOW(A) • Αν υπάρχει παραγωγήA B , και τοείναι στοFIRST() τότε περιλαμβάνουμε στο FOLLOW(B) όλα τα σύμβολα τουFOLLOW(A) Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧVΙ Παραδείγματα FOLLOW (γραμματική αριθμητικών εκφράσεων) Τμ. Πληροφορικής, Α.Π.Θ.
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧVΙΙ • Δεν μπορούν να χρησιμοποιηθούν αριστερά αναδρομικές γραμματικές. • Δεν μπορούν να χρησιμοποιηθούν γραμματικές, που δεν είναι LL(1), όπως π.χ.: σειρά_εντολών = εντολή “;” σειρά_εντολών | εντολή. εντολή = “τερματικό”. Τμ. Πληροφορικής, Α.Π.Θ.