Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεPanthea Economides Τροποποιήθηκε πριν 9 χρόνια
1
Γραμματικές Ι Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
2
Γραμματικές ΙΙ Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
3
Γραμματικές ΙΙΙ Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
4
Γραμματικές ΙV Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
5
Γραμματικές V Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
6
Γραμματικές και συντακτική ανάλυση Ι
Έστω, η γραμματική χωρίς συμφραζόμενα Γ=(Τ,Ν,S,R), όπου Τ={NUMBER,+,-,*,/,(,)} N={E} S=E με κανόνες παραγωγής: E E+E (1) | E-E (2) | E*E (3) | E/E (4) | (E) (5) | NUMBER (6) Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
7
Γραμματικές και συντακτική ανάλυση ΙΙ
Η παραπάνω γραμματική μπορεί να αναλύσει την παράσταση (3+7)/(8-6). Πρώτα χρησιμοποιεί τον κανόνα παραγωγής (4) και σχηματίζει το δένδρο: Μετά σχηματίζει το αριστερό και το δεξί υποδένδρο χρησιμοποιώντας τον κανόνα παραγωγής (5): Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
8
Γραμματικές και συντακτική ανάλυση ΙΙΙ
Η ανάλυση συνεχίζει με τα φύλλα Ε στα δύο υποδένδρα. Το Ε στο αριστερό υποδένδρο αναλύεται με τον κανόνα παραγωγής (1) και το Ε στο δεξί υποδένδρο αναλύεται με τον κανόνα παραγωγής (2). Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
9
Γραμματικές και συντακτική ανάλυση ΙV
Τέλος όλα τα φύλλα Ε αναλύονται με τον κανόνα παραγωγής (6). Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
10
Γραμματικές και συντακτική ανάλυση V
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
11
Γραμματικές και συντακτική ανάλυση VI
Το αποτέλεσμα της ανάλυσης είναι ένα παράγωγο δένδρο. Όταν η ανάλυση προχωράει πάντα πρώτα με το σχηματισμό των αριστερών υποδένδρων, τότε λέμε ότι η ανάλυση σχηματίζει αριστερές προτασιακές μορφές. Λέμε ότι η συμβολοσειρά είναι μια αριστερή προτασιακή μορφή, αν έχει προκύψει από τις προηγούμενες, εφαρμόζοντας κάθε φορά παραγωγή, που αντικαθιστά το πρώτο μη τερματικό σύμβολο από αριστερά. Αυτό γράφεται ως, Μια συμβολοσειρά είναι δεξιά προτασιακή μορφή, αν έχει προκύψει εφαρμόζοντας κάθε φορά παραγωγή, που αντικαθιστά το πρώτο μη τερματικό σύμβολο από δεξιά. Αυτό γράφεται ως Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
12
Γραμματικές και συντακτική ανάλυση VII
Λέμε ότι μια γραμματική είναι γραμματική LL(k) αν κάθε της πρόταση μπορεί να προέλθει από την αρχή της μέσω αριστερών προτασιακών μορφών, όπου ο κανόνας που εφαρμόζεται σε κάθε παραγωγή μπορεί να προβλεφθεί με βάση τα k επόμενα σύμβολα της συμβολοσειράς. Όλες οι γλώσσες της οικογένειας LL είναι προσδιοριστικές. Μια γραμματική είναι γραμματική LR(k) αν κάθε της πρόταση μπορεί να παραχθεί από την αρχή της μέσω δεξιών προτασιακών μορφών, που προκύπτουν με εφαρμογή κανόνα ο οποίος μπορεί να ανιχνευθεί με βάση τα k πρώτα τερματικά σύμβολα της προτασιακής μορφής. Όλες οι γλώσσες της οικογένειας LR είναι προσδιοριστικές. Η οικογένεια των γλωσσών LR(1) είναι ακριβώς η οικογένεια των προσδιοριστικών γλωσσών και είναι ευρύτερη από την οικογένεια των γλωσσών LL. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
13
Συμβολισμοί BNF και EBNF I
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
14
Συμβολισμοί BNF και EBNF II
ΠΑΡΑΔΕΙΓΜΑ: Γραμματική αριθμητικών εκφράσεων S = έκφραση. έκφραση = έκφραση “+” όρος | έκφραση “-” όρος | όρος. όρος = όρος “*” παράγοντας | όρος “/” παράγοντας | παράγοντας. παράγοντας = “(” έκφραση “)” | αριθμός. αριθμός = ψηφίο { ψηφίο }. ψηφίο = “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
15
Παράγωγα και συντακτικά δένδρα I
Ένα παράγωγο δένδρο αναπαριστά τη δομή μιας πρότασης και έχει το χαρακτηριστικό ότι μπορεί να αντιστοιχεί σε περισσότερες από μία παραγωγές. ΠΑΡΑΔΕΙΓΜΑ S = έκφραση. έκφραση = έκφραση ΤΛ έκφραση | “(” έκφραση “)” | “αριθμός”. ΤΛ = “+” | “-” | “*” | “/”. ΠΡΌΤΑΣΗ: (27-5)*8 Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
16
Παράγωγα και συντακτικά δένδρα II
Παραγωγή μέσω δεξιών προτασιακών μορφών Παραγωγή μέσω αριστερών προτασιακών μορφών Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
17
Παράγωγα και συντακτικά δένδρα IIΙ
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
18
Παράγωγα και συντακτικά δένδρα IV
Συντακτικό δένδρο: πιο συμπαγής δομή που παράλληλα περιέχει και την πληροφορία για τη στατική σημασία της πρότασης Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
19
Γραμματικές με ασάφειες Ι
Λέμε ότι μια γραμματική περιέχει ασάφειες, όταν σε μια πρότασή της μπορεί να αντιστοιχούν περισσότερα από ένα δένδρα. ΑΣΑΦΕΙΑ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΤΕΛΕΣΤΩΝ S = έκφραση. έκφραση = έκφραση ΤΛ έκφραση | “(” έκφραση “)” | “αριθμός”. ΤΛ = “+” | “-” | “*” | “/”. ΠΡΟΤΑΣΗ: 27-5*8 Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
20
Γραμματικές με ασάφειες ΙΙ
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
21
Γραμματικές με ασάφειες ΙΙΙ
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
22
Γραμματικές με ασάφειες ΙV
Σωστό δένδρο είναι το δένδρο εκείνο που είναι συμβατό με τη σημασία που θέλει να αποδώσει ο κατασκευαστής σε κάθε στοιχείο της γλώσσας. Για την ασάφεια προτεραιότητας τελεστών απαιτείται η χρήση κανόνων αποσαφήνισης προτεραιοτήτων. S = έκφραση. έκφραση = έκφραση ΤΛ_ΑΘ έκφραση | όρος. ΤΛ_ΑΘ = “+” | “-”. όρος = όρος ΤΛ_ΓΙ όρος | παράγοντας. ΤΛ_ΓΙ = “*” | “/”. παράγοντας = “(” έκφραση “)” | “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
23
Γραμματικές με ασάφειες V
Η προηγούμενη γραμματική παραμένει δέσμια ασάφειας ως προς την προσεταιριστικότητα των πράξεων: πως γίνεται η ανάλυση της ; Η συγκεκριμένη γραμματική αφήνει ανοικτό και το ενδεχόμενο (27-5)-8 αλλά και το ενδεχόμενο 27-(5-8). Συνήθως μας ενδιαφέρει να διασφαλίζουμε αριστερή προσεταιριστικότητα και αυτό επιτυγχάνεται αν ο αντίστοιχος κανόνας της γραμματικής χαρακτηρίζεται από αριστερή και μόνο αριστερή αναδρομικότητα. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
24
Γραμματικές με ασάφειες VΙ
Διορθωμένη γραμματική: S = έκφραση. έκφραση = έκφραση ΤΛ_ΑΘ όρος | όρος. ΤΛ_ΑΘ = “+” | “-”. όρος = όρος ΤΛ_ΓΙ παράγοντας | παράγοντας. ΤΛ_ΓΙ = “*” | “/”. παράγοντας = “(” έκφραση “)” | “αριθμός”. Πρόταση: *8 Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
25
Γραμματικές με ασάφειες VΙΙ
Πρόταση: Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
26
Γραμματικές με ασάφειες VΙΙI
ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΜΕΤΕΩΡΟΥ ELSE S = εντολή. εντολή = “if” έκφραση “then” εντολή | “if” έκφραση “then” εντολή “else” εντολή | άλλο. if EK1 then if EK2 then ΕΝΤ1 else ΕΝΤ2 Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
27
Γραμματικές με ασάφειες IΧ
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
28
Γραμματικές με ασάφειες Χ
ΓΡΑΜΜΑΤΙΚΗ ΠΟΥ ΑΠΟΦΕΥΓΕΙ ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΜΕΤΕΩΡΟΥ ELSE ΜΕ ΤΕΧΝΑΣΜΑ S = εντολή. εντολή = συν_εντολή | ασυν_εντολή. συν_εντολή=“if” έκφραση “then” συν_εντολή “else” συν_εντολή | άλλο. ασυν_εντολή= “if” έκφραση “then” εντολή | “if” έκφραση “then” συν_εντολή “else” ασυν_εντολή. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
29
Αναπαράσταση παράγωγου δένδρου
#define astEmptyProgram 399 #define astProgram #define astEmptyDeclSeq 401 #define astDeclSeq #define astDecl /* */ /* THE STRUCTURE FOR THE ABSTRACT SYNTAX TREE NODES ---- */ typedef struct AstNode_tag { int NodeType; struct symbol_tag *SymbolNode; struct AstNode_tag *pAstNode[4]; } AstNode; Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
30
Καθοδική Ανάλυση Ξεκινά από τη αρχή της γραμματικής (ρίζα δένδρου) για να αναπτύξει τη συμβολοσειρά, που αναλύει, αν αυτή αποτελεί πρόταση. Καμία από τις τεχνικές που θα εξετάσουμε δεν μπορεί να εφαρμοσθεί σε αριστερά αναδρομικές γραμματικές. Διακρίνουμε της τεχνικές της οπισθοδρόμησης και τις τεχνικές της πρόγνωσης. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
31
Καθοδική ανάλυση με οπισθοδρόμηση Ι
Δοθέντος συγκεκριμένου μη τερματικού συμβόλου εφαρμόζεται ο πρώτος κανόνας της γραμματικής. Στην προτασιακή μορφή, που προκύπτει επιλέγεται το πρώτο από αριστερά μη τερματικό σύμβολο και εφαρμόζεται ο πρώτος κανόνας, που αναφέρεται σε αυτό. Γίνεται επαναληπτική εφαρμογή του βήματος 2, για κάθε ένα από τα μη τερματικά σύμβολα, που ακολουθούν, μέχρι τη στιγμή της παραγωγής, μιας σειράς τερματικών συμβόλων (πρόταση γλώσσας αν ταυτίζεται) ή τμήματος τερματικών συμβόλων της προτασιακής μορφής, που διαφέρει από το αντίστοιχο τμήμα της συμβολοσειράς εισόδου Η δεύτερη περίπτωση μπορεί να είναι αποτέλεσμα εσφαλμένης επιλογής κανόνα. Αναιρείται ο κανόνας που εφαρμόσθηκε τελευταίος και χρησιμοποιείται ο επόμενος που ισχύει για το ίδιο μη τερματικό σύμβολο. Αν έχουν χρησιμοποιηθεί όλοι οι κανόνες, τότε ο αλγόριθμος διατηρεί το σύμβολο ως έχει και προχωρά στην αναίρεση του κανόνα για το προηγούμενο μη τερματικό σύμβολο και οπισθοδρομεί στην κατάλληλη θέση της συμβολοσειράς εισόδου. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
32
Καθοδική ανάλυση με οπισθοδρόμηση ΙΙ
ΠΑΡΑΔΕΙΓΜΑ S = “k” X “n” | “k” Y. X = “l” | “m”. Y = “mmn” | “nnm”. ΠΡΟΤΑΣΗ: “kmmm” Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
33
Καθοδική ανάλυση με οπισθοδρόμηση ΙΙI
Ιδιαίτερα πολύπλοκη Όχι αποδοτική Αρκετά γενική, δηλ. αναγνωρίζει πιο πολλές γλώσσες από τις άλλες τεχνικές καθοδικής ανάλυσης Αργεί στον εντοπισμό των λαθών και έτσι η ανάνηψη γίνεται πολύ δύσκολη Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
34
Ανάλυση προβλέπουσας αναδρομικής κατάβασης Ι
Στην ανάλυση αναδρομικής κατάβασης ο κάθε κανόνας, που αναφέρεται σε κάποιο μη τερματικό σύμβολο, εκφράζεται από τον ορισμό μιας διαδικασίας, που θα το αναγνωρίζει. Ένας αναλυτής προβλέπουσας αναδρομικής κατάβασης αποτελείται: από μία καθολική μεταβλητή, που περιέχει την τιμή της τρέχουσας λεξικής μονάδας από μία βοηθητική διαδικασία αναγνώρισης, που ελέγχει αν η τρέχουσα λεξική μονάδα είναι η αναμενόμενη και καλεί τη διαδικασία λεξικής ανάλυσης, για την ανάγνωση της επόμενης λεξικής μονάδας και την ενημέρωση της καθολικής μεταβλητής από τις διαδικασίες ανάλυσης, που αντιστοιχούν στα μη τερματικά σύμβολα της γραμματικής από μια διαδικασία εκκίνησης, που αφού διαβάσει την πρώτη λεξική μονάδα καλεί τη διαδικασία, που αντιστοιχεί στο μη τερματικό σύμβολο της αρχής. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
35
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙ
ΠΑΡΑΔΕΙΓΜΑ S = έκφραση. έκφραση = έκφραση “+” όρος | έκφραση “-” όρος | όρος. όρος = όρος “*” παράγοντας | όρος “/” παράγοντας | παράγοντας. παράγοντας = “(” έκφραση “)” | “αριθμός”. παράγοντας: Επέλεξε ΛΕΞ_ΜΟΝ περίπτωση “(”: αναγνώρισε (“(”); έκφραση; αναγνώρισε (“)”); περίπτωση “αριθμός”: αναγνώρισε(“αριθμός”); αλλιώς: λάθος; Τέλος παράγοντα. //αν_λεξ_μον: αναμενόμενη λεξ. μονάδα αναγνώρισε (αν_λεξ_μον): αν (ΛΕΞ_ΜΟΝ=αν_λεξ_μον) τότε διάβασε την επόμενη μονάδα και ενημέρωσε τη μεταβλητή ΛΕΞ_ΜΟΝ; αλλιώς τέλος αν Τέλος αναγνώρισε. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
36
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙI
Η προβλέπουσα αναδρομική κατάβαση στηρίζεται στην πρόγνωση του κατάλληλου κάθε φορά κανόνα, που οδηγεί στην παραγωγή του δένδρου της πρότασης. Δε μπορεί να εφαρμοσθεί σε αριστερά αναδρομικές γραμματικές, όπως αυτή του προηγούμενου παραδείγματος. Ας θεωρήσουμε τη μη αριστερά αναδρομική γραμματική των αριθμητικών εκφράσεων: S = έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = “+” όρος υπ_όροι | “-” όρος υπ_όροι | ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = “*” παράγοντας υπ_παραγ | “/” παράγοντας υπ_παραγ | ε. παράγοντας = “(”έκφραση “)” | “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
37
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙV
Για το μη τερματικό σύμβολο «έκφραση», μπορεί εναλλακτικά να έχουμε την παραγωγή, έκφραση όρος υπ_όροι παράγοντας υπ_παραγ υπ_όροι (έκφραση) υπ_παραγ υπ_όροι ή την παραγωγή έκφραση όρος υπ_όροι παράγοντας υπ_παραγ υπ_όροι αριθμός υπ_παραγ υπ_όροι Γενικά, για να στηριχθεί η ανάλυση στην τεχνική της πρόγνωσης χρειάζεται για κάθε μη τερματικό σύμβολο, να είναι εκ των προτέρων γνωστό τo σύνολο των τερματικών, που είναι δυνατό να εμφανισθούν στην αρχή των συμβολοσειρών, που παράγονται από αυτό (σύνολο FIRST). Επιπλέον, αν η γραμματική περιλαμβάνει κανόνες-ε, τότε για κάθε μη τερματικό σύμβολο που βρίσκεται στο αριστερό μέρος ενός τέτοιου κανόνα, επιβάλλεται και ο υπολογισμός του συνόλου των τερματικών, που μπορεί να εμφανισθούν αμέσως μετά από αυτό (σύνολο FOLLOW). Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
38
Ανάλυση προβλέπουσας αναδρομικής κατάβασης V
Ανάλυση πρόγνωσης: κεντρική ιδέα Δοθείσης μιας παραγωγής A , ο αναλυτής πρέπει να είναι σε θέση να επιλέξει μεταξύ & Σύνολα FIRST Για ένα δεξί μέρος παραγωγής G, ορίζουμε ως FIRST() το σύνολο των αναγνωριστικών που εμφανίζονται πρώτα στις συμβολοσειρές που παράγονται από το . Δηλαδή ισχύει, x FIRST() αν και μόνο αν * x , για κάποια συμβολοσειρά Γραμματική LL(1) Αν A και A εμφανίζονται στη γραμματική πρέπει FIRST() FIRST() = Αυτό επιτρέπει στον αναλυτή να προγνώσει με ασφάλεια την παραγωγή που θα χρησιμοποιεί σε κάθε βήμα! Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
39
Ανάλυση προβλέπουσας αναδρομικής κατάβασης VΙ
Δοθείσης μιας γραμματικής που έχει την ιδιότητα LL(1) μπορούμε να γράψουμε διαδικασίες που να αναγνωρίζουν το αριστερό μέρος της κάθε παραγωγής ο κώδικας της ανάλυσης είναι απλός και γρήγορος Οι γραμματικές με την ιδιότητα LL(1) ονομάζονται προγνώσιμες γραμματικές γιατί ο αναλυτής μπορεί να «προγνώσει» τη σωστή ανάπτυξη σε κάθε σημείο της ανάλυσης. Οι αναλυτές που εκμεταλλεύονται την ιδιότητα LL(1) ονομάζονται αναλυτές πρόγνωσης. Μία περίπτωση ανάλυσης πρόγνωσης είναι η ανάλυση προβλέπουσας αναδρομικής κατάβασης. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
40
Ανάλυση προβλέπουσας αναδρομικής κατάβασης 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(); default: return;} } void Factor() { 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(); default: return; } Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
41
Ανάλυση προβλέπουσας αναδρομικής κατάβασης VΙII
Παράδειγμα διορθωμένης γραμματικής αριθμητικών εκφράσεων (βλ. διαφάνεια Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΙΙΙ) Για την κατασκευή παράγωγου δένδρου: Γράφουμε μέσα στις διαδικασίες κώδικα για δημιουργία κόμβου Περνάμε τους κόμβους από διαδικασία σε διαδικασία μέσω μιας στοίβας Αφαιρούμε από τη στοίβα τους κόμβους του δεξιού μέρους της παραγωγής, τους κάνουμε απογόνους του κόμβου του αριστερού μέρους και εισάγουμε τον τελευταίο στη στοίβα Για την κατασκευή συντακτικού δένδρου Κατασκευάζουμε λιγότερους κόμβους Χρειάζεται να τους βάζουμε στη στοίβα με την κατάλληλη σειρά ώστε να εξασφαλίζουμε αριστερή προσεταιριστικότητα Expr() { Term(); ExprPrime(); /* δημιουργία κόμβου Expr; εξαγωγή κόμβου ExprPrime από στοίβα; εξαγωγή κόμβου Term από στοίβα; καθιστούμε ExprPrime και Term απογόνους του Expr; εισαγωγή κόμβου Expr στη στοίβα; */ } Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
42
Ανάλυση προβλέπουσας αναδρομικής κατάβασης IΧ
Άλλο παράδειγμα S = “if” E “then” S “else” S | “begin” S L | “print” E. L = “end” | “;” S L. E = “num” “=” “num” 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); } void L() { switch(lookahead) { case END: match(END); break; case SEMI: match(SEMI); S(); L(); break; default: error(); } Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
43
Ανάλυση προβλέπουσας αναδρομικής κατάβασης Χ
main: κλήση S(); S1: εφαρμογή της παραγωγής (S, IF) : Sif E then S else 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): Sprint E 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 Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
44
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙ
Γενική μορφή διαδικασιών προβλέπουσας αναδρομικής κατάβασης Αν για το μη τερματικό σύμβολο Χ ορίζεται στη γραμματική ο κανόνας και αν υποθέσουμε ότι η είναι απαλείψιμη, τότε Χ: Επέλεξε ΛΕΞ_ΜΟΝ περιπτώσεις FIRST( ): διαδικασίες αναγνώρισης .... περιπτώσεις FIRST( ) FOLLOW(X): διαδικασίες αναγνώρισης ή των συμβόλων που ακολουθούν αλλιώς λάθος; Τέλος Χ. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
45
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙΙ
ΣΥΝΟΛΑ 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 Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
46
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙΙΙ
ΣΥΝΟΛΑ 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 Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
47
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧΙV
ΠΑΡΑΔΕΙΓΜΑ ΥΠΟΛΟΓΙΣΜΟΥ ΣΥΝΟΛΩΝ FIRST S = έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = “+” όρος υπ_όροι | “-” όρος υπ_όροι | ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = “*” παράγοντας υπ_παραγ | “/” παράγοντας υπ_παραγ παράγοντας = “(”έκφραση “)” | “αριθμός”. Σύμβολα FIRST Σύμβολα FIRST Συμβ/ρές FIRST S {“(”, “αριθμός”} παράγοντας {“(”, “αριθμός”} “+” όρος υπ_όροι {“+”} έκφραση {“(”, “αριθμός”} αριθμός {“αριθμός”} “-” όρος υπ_όροι {“-”} υπ_όροι { , “+”, “-” } “+” {“+”} “*” παράγοντας υπ_παραγ {“*”} όρος {“(”, “αριθμός”} “-” {“-”} “/” παράγοντας υπ_παραγ {“/”} υπ_παραγ { , “*”, “/” } “*” {“*”} “/” {“/”} “(” {“(”} Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
48
Ανάλυση προβλέπουσας αναδρομικής κατάβασης Χ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) Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
49
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧVΙ
Παραδείγματα FOLLOW (γραμματική αριθμητικών εκφράσεων) Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
50
Ανάλυση προβλέπουσας αναδρομικής κατάβασης ΧVΙΙ
Δεν μπορούν να χρησιμοποιηθούν αριστερά αναδρομικές γραμματικές. Δεν μπορούν να χρησιμοποιηθούν γραμματικές, που δεν είναι LL(1), όπως π.χ.: σειρά_εντολών = εντολή “;” σειρά_εντολών | εντολή. εντολή = “τερματικό”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
51
Ανάλυση LL(1) I Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
52
Ανάλυση LL(1) II Αλγόριθμος υπολογισμού πίνακα ανάλυσης Μ
Για όλες τις παραγωγές A , εφάρμοσε τα εξής βήματα: Για κάθε τερματικό a στο FIRST(), θέσε A στη θέση M[A, a] Αν το περιλαμβάνεται στο FIRST(), θέσε A στις θέσεις M[A, b] για κάθε τερματικό b του FOLLOW(A) και θέσε A στη θέση M[A, $] αν το $ περιλαμβάνεται στο FOLLOW(A) Όλες οι υπόλοιπες θέσεις του πίνακα M εκφράζουν την αναγνώριση λάθους. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
53
Ανάλυση LL(1) IIΙ ΠΑΡΑΔΕΙΓΜΑ (γραμματική αριθμητικών εκφράσεων)
S = έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = “+” όρος υπ_όροι | “-” όρος υπ_όροι | ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = “*” παράγοντας υπ_παραγ | “/” παράγοντας υπ_παραγ παράγοντας = “(”έκφραση “)” | “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
54
Ανάλυση LL(1) IV ΠΑΡΑΔΕΙΓΜΑ (γραμματική αριθμητικών εκφράσεων - συνέχεια) Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
55
Ανάλυση LL(1) V Αλγόριθμος ανάλυσης LL(1)
push($); // $ είναι το σύμβολο τέλους της συμβολοσειράς push(S); // S είναι η αρχή της γραμματικής lookahead = get_next_token(); // διάβασε το επόμενο αναγνωριστικό repeat X = top_of_stack(); if (X είναι τερματικό ή X = = $) then if (X = = lookahead) then pop(X); lookahead = get_next_token(); else error(); else // X ένα μη τερματικό if ( M[X, lookahead] = = X Y1 Y2 ... Yk) then push(Yk); push(Yk-1); ... push(Y1); until (X = $) Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
56
Απομάκρυνση αριστερής αναδρομικότητας Ι
Διακρίνουμε την άμεση και την έμμεση αριστερή αναδρομικότητα ΠΑΡΑΔΕΙΓΜΑ ΑΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: έκφραση = έκφραση ΤΛ_ΑΘ όρος | όρος. ΠΑΡΑΔΕΙΓΜΑ ΕΜΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: ΓΕΝΙΚΗ ΜΟΡΦΗ ΑΜΕΣΗΣ ΑΡ. ΑΝΑΔΡΟΜΙΚΟΤΗΤΑΣ: μετασχηματίζεται στην ισοδύναμη μορφή Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
57
Απομάκρυνση αριστερής αναδρομικότητας ΙΙ
ΠΑΡΑΔΕΙΓΜΑ Η S = έκφραση. έκφραση = έκφραση “+” όρος | έκφραση “-” όρος | όρος. όρος = όρος “*” παράγοντας | όρος “/” παράγοντας | παράγοντας. παράγοντας = “(” έκφραση “)” | “αριθμός”. μετασχηματίστηκε στην S = έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = “+” όρος υπ_όροι | “-” όρος υπ_όροι | ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = “*” παράγοντας υπ_παραγ | “/” παράγοντας υπ_παραγ | ε. παράγοντας = “(”έκφραση “)” | “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
58
Απομάκρυνση αριστερής αναδρομικότητας ΙΙΙ
Αλγόριθμος απομάκρυνσης άμεσης και έμμεσης αριστερής αναδρομικότητας Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
59
Απομάκρυνση αριστερής αναδρομικότητας ΙV
Κατά την απομάκρυνση της αριστερής αναδρομικότητας δεν αλλάζει η γλώσσα της γραμματικής. Αλλάζει η μορφή των δένδρων που παράγει η επιλεγείσα μέθοδος ανάλυσης. Σημαντικότερη συνέπεια είναι το γεγονός ότι χάνεται η επιθυμητή ιδιότητα της αριστερής προσεταιριστικότητας. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
60
Αριστερή παραγοντοποίηση Ι
Προηγείται οποιασδήποτε προβλέπουσας ανάλυσης, αν για το ίδιο μη τερματικό σύνολο υπάρχουν δύο ή περισσότεροι κανόνες με το ίδιο πρόθεμα στο δεξί μέρος. ΠΑΡΑΔΕΙΓΜΑΤΑ σειρά_εντολών = εντολή “;” σειρά_εντολών | εντολή. εντολή = “τερματικό”. ή εντολή_if = “if” έκφραση “then” εντολή | “if” έκφραση “then” εντολή “else” εντολή. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
61
Αριστερή παραγοντοποίηση ΙΙ
Γενικά, ο κανόνας μετασχηματίζεται στον Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
62
Ανοδική ανάλυση – Γενικά Ι
Η συμβολοσειρά εισόδου σταδιακά απλοποιείται στο σύμβολο της αρχής της γραμματικής, καθώς διαβάζεται από αριστερά προς τα δεξιά παράλληλα με την εφαρμογή κανόνων για τα σύμβολα, που έχουν ήδη διαβασθεί. Η αντιστροφή της απλοποίησης που εκτελεί μία διαδικασία ανοδικής ανάλυσης είναι μία παραγωγή δεξιών προτασιακών μορφών. Το δένδρο «αναπτύσσεται» βήμα προς βήμα, από αριστερά προς τα δεξιά και από τα φύλλα προς τη ρίζα. Κάθε διαδικασία ανοδικής ανάλυσης συντονίζει την εκτέλεση ενεργειών ώθησης (στη στοίβα), απλοποίησης και αποδοχής. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
63
Ανοδική ανάλυση – Γενικά ΙΙ
Ενέργεια ώθησης Ωθείται η τρέχουσα λεξική μονάδα στη στοίβα και διαβάζεται η επόμενη. Δημιουργείται για το σύμβολο που ωθείται ο αντίστοιχος κόμβος με τη μορφή νέου δένδρου, στα δεξιά του δάσους που αποτελείται από δένδρα, που δημιουργήθηκαν στα προηγούμενα βήματα της ανάλυσης. Ενέργεια απλοποίησης Σε μία ενέργεια απλοποίησης με βάση ένα συγκεκριμένο κανόνα της γραμματικής, έχουμε δημιουργία ενός νέου κόμβου για το μη τερματικό σύμβολο Χ και μετατροπή των n ριζών που βρίσκονται στα δεξιά του δάσους, σε απογόνους του νέου κόμβου. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
64
Ανοδική ανάλυση ώθησης – απλοποίησης Ι
S = έκφραση. έκφραση = έκφραση “+” “αριθμός” | “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
65
Ανοδική ανάλυση ώθησης – απλοποίησης ΙΙ
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
66
Ανοδική ανάλυση ώθησης – απλοποίησης ΙΙΙ
Το ζωτικό πρόθεμα μιας οποιασδήποτε δεξιάς προτασιακής μορφής είναι το σύνολο των συμβόλων, που περιέχονται στη στοίβα, σε κάποιο βήμα της ανάλυσης (δηλ. οι ρίζες των δένδρων που σχηματίζονται). Ένα σύνολο συμβόλων, που μπορεί να βρίσκεται στην κορυφή της στοίβας και συμβαίνει να ταιριάζει με το δεξί μέρος ενός κανόνα παραγωγής ονομάζεται λαβή απλοποίησης. ΠΑΡΑΔΕΙΓΜΑ Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
67
Ανοδική ανάλυση ώθησης – απλοποίησης ΙV
Διαδικασίες ώθησης – απλοποίησης - ανάλυση προτεραιότητας τελεστών - ανάλυση απλής προήγησης - ανάλυση LR (η πιο σημαντική) Οι γλώσσες LR είναι προσδιοριστικές (δηλ. υπάρχει αυτόματο στοίβας που τις αναγνωρίζει με προσδιοριστικό τρόπο). Οι τεχνικές ανάλυσης LR, που χρησιμοποιούμε, δεν αναγνωρίζουν τις προτάσεις της γλώσσας με προσδιοριστικό τρόπο σε όλες τις περιπτώσεις. Πιθανά προβλήματα: Σύγκρουση ώθησης – απλοποίησης (πρόβλημα μετέωρου else). Σύγκρουση απλοποίησης – απλοποίησης. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
68
Ανάλυση LR I Η οικογένεια των γραμματικών LR είναι ένα υπερσύνολο των γραμματικών, που αναλύονται με χρήση της τεχνικής LL(1). Πλεονεκτήματα: Άμεσος εντοπισμός λαθών. Η πιο γενική ανάλυση ώθησης – απλοποίησης, που μπορεί να υλοποιηθεί χωρίς οπισθοδρόμηση και να λειτουργεί το ίδιο αποδοτικά με τις υπόλοιπες τεχνικές της ίδιας κατηγορίας. Είναι ο τύπος του κώδικα ανάλυσης, που παράγεται από τις πιο διαδεδομένες γεννήτριες κώδικα. Οι τεχνικές LR διαφέρουν μεταξύ τους ανάλογα με τον τρόπο με τον οποίο γίνεται ο συντονισμός της εκτέλεσης των ενεργειών ώθησης και απλοποίησης. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
69
Ανάλυση LR IΙ Για τον καθορισμό της επόμενης ενέργειας ο αναλυτής χρησιμοποιεί έναν αριθμό, που συνοδεύει τις ρίζες των δένδρων του δάσους. Ο αριθμός αυτός ονομάζεται κατάσταση και ειδικά η κατάσταση της ρίζας του δένδρου που βρίσκεται στα δεξιά του δάσους ονομάζεται τρέχουσα κατάσταση. Επιπλέον, στο αριστερό μέρος του δάσους υπάρχει η αρχική κατάσταση, που χρησιμοποιείται για τον καθορισμό της πρώτης ενέργειας του αναλυτή. Οι ενέργειες ενός αναλυτή LR εξαρτώνται από την εκάστοτε τρέχουσα κατάστασή του. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
70
Ανάλυση LR IΙΙ Στην ενέργεια της ώθησης, η κατάσταση της ρίζας του νέου δένδρου καθορίζεται από την τρέχουσα κατάσταση και από το σύμβολο, που ωθείται στη στοίβα (και στο δάσος). Σε ενέργεια απλοποίησης, δημιουργείται ένας νέος κόμβος για το μη τερματικό σύμβολο στο οποίο αναφέρεται ο κανόνας και συνδέονται σ΄ αυτόν ως απόγονοι, οι n πιο δεξιές ρίζες του δάσους, που αντιστοιχούν στα σύμβολα του δεξιού μέρους του κανόνα. Τότε διαγράφονται οι καταστάσεις που συνοδεύουν τις n ρίζες. Η κατάσταση που επισυνάπτεται στη νέα ρίζα, καθορίζεται με βάση την κατάσταση της ρίζας, που βρίσκεται αμέσως πιο αριστερά και το μη τερματικό σύμβολο του νέου κόμβου. Για τον καθορισμό των ενεργειών της ανάλυσης χρησιμοποιούμε έναν πίνακα ενεργειών και έναν πίνακα μεταβάσεων. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
71
Ανάλυση LR IV Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
72
Ανάλυση LR V Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
73
Ανάλυση LR VI ΠΑΡΑΔΕΙΓΜΑ Τμ. Πληροφορικής, Α.Π.Θ.
(1) έκφραση = έκφραση “+” όρος. (2) έκφραση = έκφραση “-” όρος. (3) έκφραση = όρος. (4) όρος = όρος “*” παράγοντας. (5) όρος = όρος “/” παράγοντας. (6) όρος = παράγοντας. (7) παράγοντας = “(” έκφραση “)”. (8) παράγοντας = “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
74
Ανάλυση LR VIΙ Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
75
Ανάλυση LR VIΙΙ Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
76
Ανάλυση LR ΙΧ Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
77
Αναλυτής LR ώθησης - απλοποίησης Ι
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
78
Αναλυτής LR ώθησης - απλοποίησης ΙI
push($); // $ το σύμβολο τέλους συμβολοσειράς push(s0); // s0 η αρχική κατάσταση lookahead = get_next_token(); repeat forever s = top_of_stack(); // ACTION είναι ο πίνακας ενεργειών if ( ACTION[s,lookahead] = = απλοποίηση ) then pop 2*|| σύμβολα; //αφαιρούνται τα σύμβολα & οι καταστάσεις s = top_of_stack(); push(); push(GOTO[s,]); // GOTO είναι ο πίνακας μεταβάσεων else if ( ACTION[s,lookahead] = = ώθηση si ) then push(lookahead); push(si); else if ( ACTION[s,lookahead] = = αποδοχή and lookahead = = $ ) then return (επιτυχής αναγνώριση); else error(); Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
79
Αναλυτής LR ώθησης - απλοποίησης ΙIΙ
Μια γραμματική είναι LR(k) αν, δοθείσης μιας δεξιάς παραγωγής S 0 1 2 … n-1 n πρόταση μπορούμε: 1. Να αναγνωρίσουμε μια λαβή απλοποίησης για κάθε δεξιά προτασιακή μορφή i , και 2. Να καθορίσουμε τον κανόνα της απλοποίησης με την ανάγνωση της i από αριστερά προς τα δεξιά, προχωρώντας το πολύ k σύμβολα πιο δεξιά από το τέλος της λαβής απλοποίησης της i . Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
80
Αναλυτής LR ώθησης - απλοποίησης ΙV
Στο πάνω μέρος της στοίβας είτε υπάρχουν όλες οι ενεργές λαβές απλοποίησης που περιλαμβάνουν την κορυφή της στοίβας, είτε ωθούνται σύμβολα μέχρι να αποτελεί η κορυφή το δεξί άκρο μιας λαβής απλοποίησης Η γλώσσα των λαβών απλοποίησης είναι κανονική και άρα μπορεί να κατασκευασθεί ένα προσδιοριστικό πεπερασμένο αυτόματο που να εκτελεί αναγνώριση λαβών απλοποίησης οι πίνακες ενεργειών και μετάβασης ουσιαστικά εκφράζουν το συγκεκριμένο αυτόματο Κάθε νέα κατάσταση του αυτόματου την εισάγουμε στη στοίβα Οι τελικές καταστάσεις του αυτόματου αντιστοιχούν σε ενέργειες απλοποίησης νέα κατάσταση είναι η GOTO[αριστερό σύμβολο κανόνα , κατάσταση κορυφής] Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
81
Αναλυτής LR ώθησης - απλοποίησης V
Πως φτιάχνουμε τους πίνακες ενεργειών & μεταβάσεων; Στοίβα πηγαίος κώδικας Λεξικός αναλυτής Αναλυτής Πίνακες Ενεργειών & Μεταβάσεων Γεννήτρια αναλυτή (yacc) Ενδιάμεση Αναπαράσταση γραμματική Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
82
Αναλυτής LR ώθησης - απλοποίησης VΙ
Πως φτιάχνουμε τους πίνακες ενεργειών & μεταβάσεων (χωρίς το yacc); κατασκευάζουμε από τη γραμματική το αυτόματο αναγνώρισης λαβών απλοποίησης ορίζουμε τους πίνακες ενεργειών & μεταβάσεων αν η κατασκευή του αυτομάτου πετύχει τότε η γραμματική είναι γραμματική LR(?) αλλιώς είναι πιθανό να προκύψουν συγκρούσεις ώθησης – απλοποίησης ή συγκρούσεις απλοποίησης – απλοποίησης τότε ή θα πρέπει να εφαρμοσθεί μία άλλη κατασκευή LR(?) ή να κατασκευάσουμε τον αναλυτή έτσι ώστε σε μία περίπτωση σύγκρουσης να επιλέγει κάθε φορά μία συγκεκριμένη ενέργεια οι αναλυτές του byacc όταν έχουμε σύγκρουση ώθησης – απλοποίησης εκτελούν κάθε φορά την ώθηση Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
83
Αναλυτής LR ώθησης - απλοποίησης VΙΙ
Πως φτιάχνουμε το αυτόματο αναγνώρισης λαβών απλοποίησης (χωρίς το yacc); χρησιμοποιούμε στοιχεία LR(k) για να κωδικοποιήσουμε το σύνολο των κανόνων που μπορεί το δεξί τους μέρος να αποτελέσει λαβή απλοποίησης σε μία δεδομένη κατάσταση υπολογίζουμε για κάθε κατάσταση τα goto( s, ) και closure( s ), δηλαδή το κλείσιμο (βλ. συνέχεια) καταγράφουμε τις καταστάσεις και τις μεταβάσεις του αυτόματου συμπληρώνουμε τους πίνακες ενεργειών & μεταβάσεων Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
84
Αναλυτής LR ώθησης - απλοποίησης VΙΙΙ
Στοιχείο LR(k) είναι ένα ζεύγος [A , B], όπου A είναι μία παραγωγή με μία • κάπου στο δεξί μέρος B σύμβολα εισόδου με μήκος ≤ k (τερματικά ή $) Παραδείγματα: [• , a] [• , a] [• , a] [• , a] Η • δείχνει την τρέχουσα θέση που μπορούμε να θεωρήσουμε ότι αναπαριστά η κορυφή της στοίβας στοιχεία LR(0) [ • ] (δεν υπάρχουν σύμβολα εισόδου) στοιχεία LR(1) [ • , a ] (ένα μόνο σύμβολο εισόδου) στοιχεία LR(2) [ • , a b ] (δύο σύμβολα εισόδου) ... Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
85
Πίνακες ανάλυσης LR(1) I
Η παραγωγή , με σύμβολο εισόδου a, παράγει 4 στοιχεία LR(1) [• , a], [• , a], [• , a], & [• , a] Το σύνολο των LR(1) στοιχείων μιας γραμματικής είναι πεπερασμένο. Ποια είναι η σημασία των συμβόλων εισόδου στα στοιχεία; τα καταγράφουμε έτσι ώστε να οδηγούμαστε στη σωστή απλοποίηση αν η • βρίσκεται σε ενδιάμεση θέση σε ένα μόνο στοιχείο δεν παίζει κάποιο ιδιαίτερο ρόλο π.χ. στο [• , a], το σύμβολο εισόδου δεν έχει ιδιαίτερη σημασία στο [• , a], το σύμβολο a οδηγεί στην απλοποίηση στο σύνολο { [• , a],[• , b] } συμβόλο εισόδου = a απλοποίηση σε ; σύμβολο εισόδου FIRST() ώθηση σε μία LR(1) γραμματική ένα σύμβολο εισόδου είναι αρκετό για να καθορίσει την επόμενη ενέργεια Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
86
Πίνακες ανάλυσης LR(1) II
Οι καταστάσεις του προσδιοριστικού αυτόματου αναγνώρισης λαβών απλοποίησης ορίζονται ως σύνολα στοιχείων, I0 , I1 , ... , In a. Εισάγουμε ένα νέο σύμβολο S’ και μία παραγωγή S’ S όπου S η αρχή της γραμματικής b. Η αρχική κατάσταση, I0 περιλαμβάνει τα στοιχεία [S’ •S, $] και όλα τα ισοδύναμα που δίνονται ως closure( I0 ) c. Για κάθε σύνολο Ik και κάθε σύμβολο , βρίσκουμε το goto(Ik , ) αν το σύνολο της goto(Ik , ) δεν έχει ήδη δημιουργηθεί τότε το δημιουργούμε καταγράφουμε όλες τις μεταβάσεις goto( ) Συμπληρώνουμε τους πίνακες ενεργειών και μεταβάσεων της ανάλυσης Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
87
Πίνακες ανάλυσης LR(1) IIΙ
ΥΠΟΛΟΓΙΣΜΟΣ closure(I) Το closure(I) προσθέτει στο σύνολο I όλα τα στοιχεία που προκύπτουν από τα ήδη υπάρχοντα στο I κάθε στοιχείο [ , a] δημιουργεί επίσης όλα τα [ , x] για κάθε παραγωγή με στα αριστερά και για όλα τα x FIRST(a) εφόσον συμπεριληφθούν όλα τα στοιχεία της παραγωγής περιλαμβάνονται και όσα προκύπτουν από αυτά εφαρμόζοντας την ίδια πράξη Closure( I ) while ( το σύνολο I μεγαλώνει ) for κάθε [ • , a] I for κάθε παραγωγή P for κάθε τερματικό b FIRST(a) if [ • , b] I then προσέθεσε το [ • , b] στο I Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
88
Πίνακες ανάλυσης LR(1) IV
ΥΠΟΛΟΓΙΣΜΟΣ goto(I,x) Υπολογίζει τη νέα κατάσταση που ο αναλυτής προσεγγίζει αν αυτός βρίσκεται στην κατάσταση I και αναγνωρίζει το τερματικό x goto( { [ , a] }, ) παράγει κατάσταση που περιλαμβάνει το [ , a] αν δεν υπάρχει δημιουργείται και περιλαμβάνεται σε αυτή και το closure( [ , a] ) Goto( I, x ) new = Ø for κάθε [ • x , a] I new = new [ x • , a] return closure(new) Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
89
Πίνακες ανάλυσης LR(1) V
ΑΛΓΟΡΙΘΜΟΣ ΚΑΤΑΣΚΕΥΗΣ ΑΥΤΌΜΑΤΟΥ Ξεκινάμε από το I0 = closure( [S’ • S , $] ) Δημιουργούμε συνέχεια νέες καταστάσεις μέχρι τη στιγμή που δεν θα μπορεί να δημιουργηθούν άλλες I0 = closure( [S’ • S , $] ) C = { I0 } while ( προστίθενται στο C νέα σύνολα στοιχείων ) for κάθε Ii C και κάθε x ( TNT ) Inew = goto(Ii , x) if Inew C then C = C Inew κατέγραψε τη μετάβαση Ii Inew με αναγνώριση του x Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
90
Πίνακες ανάλυσης LR(1) VΙ
Closure( I ) while ( το σύνολο I μεγαλώνει ) for κάθε [ • , a] I for κάθε παραγωγή P for κάθε τερματικό b FIRST(a) if [ • , b] I then προσέθεσε το [ • , b] στο I Goto( I, x ) new = Ø for κάθε [ • x , a] I new = new [ x • , a] return closure(new) I0 = closure( [S’ • S , $] ) C = { I0 } while ( προστίθενται στο C νέα σύνολα στοιχείων ) for κάθε Ii C και κάθε x ( TNT ) Inew = goto(Ii , x) if Inew C then C = C Inew κατέγραψε τη μετάβαση Ii Inew με αναγνώριση του x Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
91
Παράδειγμα ανάλυσης LR(1) Ι
S έκφραση έκφραση όρος - έκφραση έκφραση όρος όρος παράγοντας * όρος όρος παράγοντας παράγοντας id Σύμβολο FIRST S { id } έκφραση { id} όρος { id } παράγοντας { id} - { - } * { * } id { id} Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
92
Παράδειγμα ανάλυσης LR(1) ΙΙ
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
93
Παράδειγμα ανάλυσης LR(1) ΙΙΙ
ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΩΝ for κάθε σύνολο στοιχείων Ix C for κάθε στοιχείο Ix if στοιχείο είναι [ •a,b] και a T και goto(Ix,a) = Ik , then ACTION[x,a] “ώθηση k” else if στοιχείο είναι [S’S •,$] then ACTION[x ,$] “αποδοχή” else if στοιχείο είναι [ •,a] then ACTION[x,a] “απλοποίηση ” for κάθε n NT if goto(Ix ,n) == Ik then GOTO[x,n] k Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
94
Παράδειγμα ανάλυσης LR(1) ΙV
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
95
Συγκρούσεις ενεργειών
Τι γίνεται αν η κατάσταση s περιέχει [ • a , b] και [ • , a] ; Το πρώτο στοιχείο παράγει “ώθηση” και το δεύτερο “απλοποίηση” Δεν μπορούμε στο ACTION[s,a] να συμπληρώσουμε δύο ενέργειες Σύγκρουση ώθησης – απλοποίησης (shift – reduce conflict) Μπορούμε ή να αλλάξουμε τη γραμματική ή αυθαίρετα να επιλέξουμε την εκτέλεση ώθησης, κάτι που έχει αποδειχθεί ότι συνήθως αποδίδει τη σωστή σημασία (π.χ. Πρόβλημα μετέωρου else) ή να επιλέξουμε κάποια άλλη ανάλυση LR Τι γίνεται όταν η κατάσταση s περιέχει [ • , a] και [ • , a] ; Κάθε στοιχείο παράγει “απλοποίηση”, αλλά με διαφορετικό κανόνα Σύγκρουση απλοποίησης – απλοποίησης (reduce – reduce conflict) Ένδειξη λάθους στη γραμματική και στις δύο περιπτώσεις λέμε ότι η γραμματική δεν είναι LR(1) Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
96
Παραλλαγές ανάλυσης LR: LR(0)
Goto( I, x ) new = Ø for κάθε [ • x ] I new = new [ x • ] return closure(new) Closure( I ) while ( το σύνολο I μεγαλώνει ) for κάθε στοιχείο [ • ] I for κάθε παραγωγή P if [ • ] I then προσέθεσε το [ • ] στο I Βασικά είναι οι ίδιοι αλγόριθμοι όπως και για την ανάλυση LR(1) Η μόνη διαφορά είναι ότι στα στοιχεία LR(0) δεν υπάρχει σύμβολο εισόδου και γι΄ αυτό δεν παράγονται πολλά στοιχεία σε κάθε σύνολο Η ανάλυση LR(0) παράγει λιγότερες καταστάσεις Δεν μπορεί να αναγνωρίσει όλες τις γραμματικές που αναγνωρίζει η LR(1) Είναι πιο πιθανό να οδηγήσει σε συγκρούσεις ανάλυσης κατασκευή συνόλων στοιχείων LR(0): I0 = closure( [S’ • S ] ) C = { I0 } while ( προστίθενται στο C νέα σύνολα στοιχείων) for κάθε Ii C και κάθε x ( TNT ) Inew = goto(Ii , x) if Inew C then C = C Inew κατέγραψε τη μετάβαση Ii Inew με αναγνώριση του x Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
97
Παραλλαγές ανάλυσης LR: SLR(1)
Ο αλγόριθμος SLR(1) για να καθορίσει πότε θα γίνει απλοποίηση χρησιμοποιεί και τα σύνολα FOLLOW Οι αναλυτές SLR(1) έχουν λιγότερες καταστάσεις από ότι οι LR(1) for κάθε σύνολο στοιχείων Ix C for κάθε στοιχείο Ix if στοιχείο είναι [ •a] και a T και goto(Ix,a) = Ik , then ACTION[x,a] “ώθηση k” else if στοιχείο είναι [S’S •] then ACTION[x ,\0] “αποδοχή” else if στοιχείο είναι [ •] then for κάθε a FOLLOW() then ACTION[x,a] “απλοποίηση ” for each n NT if goto(Ix ,n) = Ik then GOTO[x,n] k Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
98
Παραλλαγές ανάλυσης LR: LALR(1)
κρατάμε τον πυρήνα LR(0) των στοιχείων LR(1) (αγνοούμε τα σύμβολα εισόδου) αν δύο σύνολα LR(1) έχουν τον ίδιο πυρήνα, τότε τα συνενώνουμε και ενημερώνουμε τους πίνακες ACTION και GOTO Οι αναλυτές LALR(1) μπορούν να φτιαχτούν με δύο τρόπους Κατασκευή των συνόλων στοιχείων LR(1) και συνένωση Αγνοούμε τα στοιχεία με τελεία στην αρχή του δεξιού μέρους και κατασκευάζουμε πυρήνες συνόλων στοιχείων LR(0). Στη συνέχεια χρησιμοποιούμε έναν αλγόριθμο προώθησης συμβόλων εισόδου για να υπολογίσουμε τα σύμβολα εισόδου. Η δεύτερη προσέγγιση είναι πιο αποδοτική επειδή αποφεύγει τη δημιουργία μεγάλων ενδιάμεσων LR(1) πινάκων Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
99
Παραλλαγές ανάλυσης LR: LALR(1)
Ένας αναλυτής LALR(1) για μια γραμματική G έχει τον ίδιο αριθμό καταστάσεων με τον αντίστοιχο αναλυτή SLR(1) Αν ένας αναλυτής LR(1) για μια γραμματική G δεν παρουσιάζει συγκρούσεις ώθησης - απλοποίησης, τότε δεν θα έχει συγκρούσεις ώθησης – απλοποίησης και ο αναλυτής LALR(1) Ένας αναλυτής LALR(1) μπορεί να εμφανίζει σύγκρουση απλοποίησης - απλοποίησης χωρίς αυτό να συμβαίνει και στον αντίστοιχο LR(1) Οι αναλυτές LALR(1) είναι πιο γενικοί από τους SLR(1) και συγχρόνως έχουν το ίδιο μικρό χώρο καταστάσεων Ανάλυση LALR(1) παράγουν οι γεννήτριες yacc και byacc Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
100
Γλώσσες χωρίς συμφραζόμενα Ι
Προσδιοριστικές γλώσσες (LR(k)) Γλώσσες LL(k) Γλώσσες απλής προήγησης Γλώσσες LL(1) Γλώσσες προτεραιότητας τελεστών LR(k) LR(1) Η ιεραρχία γλωσσών χωρίς συμφραζόμενα Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
101
Γλώσσες χωρίς συμφραζόμενα ΙΙ
Γλώσσες χωρίς ασάφειες Προτεραιότητας τελεστών LR(k) Ιεραρχία γλωσσών χωρίς συμφραζόμενα LR(1) LL(k) Οι γλώσσες προτεραιότητας τελεστών περιλαμβάνουν και κάποιες γλώσσες με ασάφειες LL(1) είναι υποσύνολο των γραμματικών SLR(1) LALR(1) SLR(1) LL(1) LR(0) Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
102
Ανάνηψη λαθών Ι Εντοπισμός λάθους όσο το δυνατόν πιο έγκαιρα.
Επιλογή θέσης από όπου θα συνεχίζεται η ανάλυση. Να εντοπίζονται μόνο υπαρκτά λάθη και να μην εμφανίζονται διαδιδόμενα πλασματικά λάθη. Να αποφεύγεται η μετάπτωση του αναλυτή σε ατέρμονες βρόχους. Τεχνικές ανάνηψης λαθών: ανάνηψη «πανικού» ανάνηψη σε επίπεδο φράσης κανόνες παραγωγής για λάθη συνολική διόρθωση Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
103
Ανάνηψη λαθών ΙΙ Η ανάνηψη «πανικού» στην προβλέπουσα αναδρομική κατάβαση υλοποιείται με τον καθορισμό μονάδων συγχρονισμού. Όταν ο αναλυτής βρει λάθος, τότε προσπερνά τις επόμενες μονάδες μέχρι να εντοπίσει μια μονάδα συγχρονισμού από την οποία μπορεί να συνεχίσει την ανάλυσης. Κάθε μη τερματικό σύμβολο έχει τις δικές του μονάδες συγχρονισμού. Οι μονάδες συγχρονισμού επιλέγονται μέσα από τα σύνολα FOLLOW. Στην ανάλυση LL(1) έχουμε εντοπισμό λάθους, όταν στην κορυφή της στοίβας βρίσκεται ένα μη τερματικό σύμβολο X, τέτοιο ώστε το τρέχον σύμβολο εισόδου να μην περιλαμβάνεται στο σύνολο FIRST(X) και αν αυτό συμβαίνει να περιέχει το ε, ούτε στο σύνολο FOLLOW(X). Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
104
Ανάνηψη «πανικού» στην ανάλυση LL(1) I
Η ανάνηψη «πανικού» μπορεί εύκολα να υλοποιηθεί με τον προσδιορισμό της κατάλληλης ενέργειας, για κάθε περίπτωση κενής θέσης, στον πίνακα ανάλυσης. Διακρίνουμε τρεις πιθανές ενέργειες ανάνηψης: την αφαίρεση του συμβόλου Χ από τη στοίβα (pop), το προσπέρασμα ενός αριθμού συμβόλων εισόδου, μέχρι τον εντοπισμό μονάδας, που μπορεί να χρησιμοποιηθεί για την επανεκκίνηση της διαδικασίας ανάλυσης (scan) και την ώθηση στη στοίβα ενός νέου μη τερματικού συμβόλου. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
105
Ανάνηψη «πανικού» στην ανάλυση LL(1) II
Η pop εκτελείται, όταν η τρέχουσα λεξική μονάδα είναι η $ ή όταν αυτή ανήκει στο FOLLOW(X). Η scan εκτελείται, όταν η τρέχουσα λεξική μονάδα δεν είναι η $ και δεν ανήκει στο . Η push επιστρατεύεται, όταν συμβεί να έχει αδειάσει η στοίβα, ενώ δεν έχει ολοκληρωθεί ακόμη η ανάγνωση όλων των μονάδων της συμβολοσειράς εισόδου. Τότε ωθείται στη στοίβα το σύμβολο της αρχής της γραμματικής και αγνοούνται ένα προς ένα όλα τα επόμενα σύμβολα εισόδου, μέχρι την ανάγνωση συμβόλου, που ανήκει στο σύνολο FIRST της αρχής. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
106
Ανάνηψη «πανικού» στην ανάλυση LL(1) III
ΠΑΡΑΔΕΙΓΜΑ (ανάνηψη λαθών στη γραμματική αριθμητικών εκφράσεων) S = έκφραση. έκφραση = όρος υπ_όροι. υπ_όροι = “+” όρος υπ_όροι | “-” όρος υπ_όροι | ε. όρος = παράγοντας υπ_παραγ. υπ_παραγ = “*” παράγοντας υπ_παραγ | “/” παράγοντας υπ_παραγ παράγοντας = “(”έκφραση “)” | “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
107
Ανάνηψη «πανικού» στην ανάλυση LL(1) IV
ΠΙΝΑΚΑΣ ΑΝΑΛΥΣΗΣ ΧΩΡΙΣ ΑΝΑΝΗΨΗ ΛΑΘΩΝ: ΠΙΝΑΚΑΣ ΑΝΑΛΥΣΗΣ ΜΕ ΑΝΑΝΗΨΗ ΛΑΘΩΝ: Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
108
Ανάνηψη «πανικού» στην ανάλυση LL(1) V
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
109
Εντοπισμός λάθους στην ανάλυση LR I
(1) έκφραση = έκφραση “+” όρος. (2) έκφραση = έκφραση “-” όρος. (3) έκφραση = όρος. (4) όρος = όρος “*” παράγοντας. (5) όρος = όρος “/” παράγοντας. (6) όρος = παράγοντας. (7) παράγοντας = “(” έκφραση “)”. (8) παράγοντας = “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
110
Εντοπισμός λάθους στην ανάλυση LR II
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
111
Εντοπισμός λάθους στην ανάλυση LR III
Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
112
Εντοπισμός λάθους στην ανάλυση LR IV
Αναγνώριση λάθους γίνεται όταν ο αλγόριθμος περιέλθει σε κατάσταση, που στον πίνακα ενεργειών δεν αντιστοιχεί συγκεκριμένη ενέργεια για το τερματικό εισόδου, που ακολουθεί. Το διαγνωστικό μήνυμα λάθους που πρέπει να τυπωθεί μπορεί να επιλεγεί αν εξετάσουμε τα περιεχόμενα της στοίβας. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
113
Εντοπισμός λάθους στην ανάλυση LR V
Ανάνηψη «πανικού»: Καθορίζεται ένα σύνολο μονάδων συγχρονισμού που συνήθως αποτελείται από διαχωριστές που δηλώνουν τέλος εντολών ή άλλων δομημένων στοιχείων της γλώσσας Όταν εντοπίζεται λάθος, τότε συνεχίζεται η ανάγνωση των λεξικών μονάδων εισόδου, μέχρι τον εντοπισμό κάποιας μονάδας συγχρονισμού. Ακολουθεί η σταδιακή αφαίρεση συμβόλων από τη στοίβα μέχρι αυτή να περιέλθει σε κατάσταση από την οποία ορίζεται συγκεκριμένη ενέργεια για το σύμβολο συγχρονισμού που εντοπίστηκε. Μετά την εκτέλεση της ενέργειας αυτής ο έλεγχος επανέρχεται στον αναλυτή για τη συνέχιση της διαδικασίας. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
114
Εντοπισμός λάθους στην ανάλυση LR VΙ
Ανάνηψη σε επίπεδο φράσης: Πρέπει όχι απλά να εντοπισθεί το λάθος, αλλά να γίνει και αναγνώριση του λάθους που εντοπίσθηκε. Η ανάνηψη αποβλέπει είτε στην τροποποίηση της κορυφής της στοίβας, είτε στην τροποποίηση των συμβόλων εισόδου που προηγούνται, για την απρόσκοπτη συνέχιση της ανάλυσης. Μία προσέγγιση αυτού του τύπου χαρακτηρίζεται από το ρίσκο να περιέλθει η ανάλυση σε ατέρμονα βρόχο. Συνιστώνται τεχνικές: που εγγυώνται την αφαίρεση από τη συμβολοσειρά εισόδου ή την ώθηση στη στοίβα τουλάχιστο μιας λεξικής μονάδας εγγυώνται το άδειασμα της στοίβας με την ολοκλήρωση της ανάγνωσης της συμβολοσειράς δεν αφαιρούν από τη στοίβα μη τερματικά σύμβολα και τις αντίστοιχες καταστάσεις, που έχουν ήδη αναγνωρισθεί Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
115
Εντοπισμός λάθους στην ανάλυση LR VΙΙ
Ανάνηψη λαθών σε αναλυτές του byacc: Τροποποιούμε τη γραμματική προσθέτοντας κανόνες παραγωγής για λάθη, της μορφής: μη τερματικό: error μονάδες_συγχρονισμού όπου error η ψευδομονάδα λάθους του byacc. Μετά τον εντοπισμό λάθους (κενή θέση στον πίνακα ενεργειών) το byacc αφαιρεί από τη στοίβα όσα σύμβολα χρειάζεται, ώστε αυτή να περιέλθει σε κατάσταση, που περιέχει ένα τουλάχιστο στοιχείο προερχόμενο από κανόνα λάθους, με την τελεία τοποθετημένη στα αριστερά της ψευδομονάδας error. Στη συνέχεια ο αναλυτής ωθεί στη στοίβα τη μονάδα error, ως αν αυτή ήταν μια τυπική περίπτωση συμβόλου εισόδου. Αν στον κανόνα λάθους δεν έχει δηλωθεί κάποια μονάδα συγχρονισμού, τότε ο αναλυτής προχωράει άμεσα σε απλοποίηση σύμφωνα με αυτόν και εκτελεί τις ενέργειες που το συνοδεύουν. Η διαδικασία συνεχίζει αγνοώντας ένα ή περισσότερα σύμβολα εισόδου, μέχρι τον εντοπισμό εκείνου, για το οποίο ο πίνακας ενεργειών ορίζει τν επόμενη ενέργεια της ανάλυσης. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
116
Εντοπισμός λάθους στην ανάλυση LR VΙΙΙ
ΠΑΡΑΔΕΙΓΜΑ: ΓΡΑΜΜΑΤΙΚΗ ΑΡΙΘΜΗΤΙΚΩΝ ΕΚΦΡΑΣΕΩΝ Γράφουμε τον τελευταίο κανόνα της γραμματική μέσα στο byacc ως εξής: paragontas : ARITHMOS {$$=$1;} | ‘(’ ekfrasi ‘)’ {$$=$2;} | error {$$=0;} ; (1) έκφραση = έκφραση “+” όρος. (2) έκφραση = έκφραση “-” όρος. (3) έκφραση = όρος. (4) όρος = όρος “*” παράγοντας. (5) όρος = όρος “/” παράγοντας. (6) όρος = παράγοντας. (7) παράγοντας = “(” έκφραση “)”. (8) παράγοντας = “αριθμός”. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
117
Εντοπισμός λάθους στην ανάλυση LR IX
ΠΑΡΑΔΕΙΓΜΑ: ΓΡΑΜΜΑΤΙΚΗ ΑΡΙΘΜΗΤΙΚΩΝ ΕΚΦΡΑΣΕΩΝ (συνέχεια) σημείωση: στην παραπάνω ανάλυση οι πίνακες της ανάλυσης είναι οι LALR(1) πίνακες που παράγει το byacc και όχι αυτοί που χρησιμοποιήσαμε σε προηγούμενα παραδείγματα Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
118
Εντοπισμός λάθους στην ανάλυση LR X
σημαντική λεπτομέρεια: Μετά την εκτέλεση απλοποίησης σύμφωνα με κανόνα λάθους ο αναλυτής δεν εντοπίζει άλλο λάθος (αγνοεί τη ψευδομονάδα error) αν προηγουμένως δεν έχει εκτελέσει τρεις διαδοχικές ενέργειες ώθησης σε κανονική λειτουργία. Αυτό γίνεται για να αποφεύγεται ο εντοπισμός διαδιδόμενων (πλασματικών) λαθών και λέμε ότι τότε ο αναλυτής συνεχίζει τη λειτουργία του σε κατάσταση λάθους. Πρέπει η διαχείριση λαθών να γίνεται με τέτοιο τρόπο ώστε η επαναφορά του μεταγλωττιστή σε κανονική λειτουργία να γίνεται μετά από ανάγνωση ενός εύλογου αριθμού συμβόλων και όχι αφού έχει διαβασθεί ένα μεγάλο μέρος του προγράμματος χωρίς ουσιαστικά ο αναλυτής να έχει τη δυνατότητα εντοπισμού λαθών. Όταν δεν υπάρχει κίνδυνος εντοπισμού διαδιδόμενων λαθών μπορείτε να χρησιμοποιείτε το macro yyerrok, που επαναφέρει τον αναλυτή σε κανονική λειτουργία χωρίς να έχει προηγηθεί η εκτέλεση τριών ενεργειών ώθησης. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
119
Εντοπισμός λάθους στην ανάλυση LR XΙ
ΠΡΟΣΟΧΗ: Αν στο προηγούμενο παράδειγμα γράφαμ paragontas : ARITHMOS {$$=$1;} | ‘(’ ekfrasi ‘)’ {$$=$2;} | error { yyerrok; $$=0; } ; τότε η ανάλυση της συμβολοσειράς 27 8 οδηγείται σε έναν ατέρμονα βρόχο εκτύπωσης του μηνύματος syntax error Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
120
Εντοπισμός λάθους στην ανάλυση LR X
περίπτωση που η χρήση του yyerrok είναι επωφελής: while_statement : WHILE expr DO statement DONE { $$=exec_do_while($2,$4); } | error DONE yyerror(“Bad WHILE syntax”); yyerrok; $$=NULL; ; άλλη δυνατότητα: να αγνοηθεί το σύμβολο εισόδου, που προκαλεί τον εντοπισμό λάθους και να συνεχισθεί η ανάλυση με το σύμβολο που ακλουθεί. Για να γίνει αυτό χρησιμοποιείτε το macro yyclearin Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
121
Εντοπισμός λάθους στην ανάλυση LR XI
Στο παράδειγμα της προηγούμενης διαφάνειας ο κανόνας λάθους συνοδεύεται από μονάδα συγχρονισμού. Πως αντιδρά ο αναλυτής σε μία τέτοια περίπτωση; Το byacc αγνοεί όσα σύμβολα εισόδου χρειάζεται, μέχρι τον εντοπισμό κάποιου που είτε είναι μία από τις μονάδες συγχρονισμού, είτε μπορεί δυνητικά να απλοποιηθεί σε κάποιο απ΄ αυτά (αν αυτό είναι μη τερματικό). Τότε το συγκεκριμένο σύμβολο ωθείται στη στοίβα, οπότε η ανάλυση μπορεί (σε ένα ή περισσότερα βήματα) να εκτελέσει απλοποίηση σύμφωνα με τον κανόνα του λάθους και να συνεχίσει την πορεία της. Τμ. Πληροφορικής, Α.Π.Θ. Κυριακή, 9 Απριλίου 2017
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.