Κεφάλαιο 4 :: Σημασιολογική Ανάλυση Πραγματολογία των Γλωσσών Προγραμματισμού Michael L. Scott Copyright © 2005 Elsevier
Ο Ρόλος της Σημασιολογικής Ανάλυσης Μετά τη συντακτική ανάλυση, οι επόμενες δύο φάσεις ενός «τυπικού» μεταγλωττιστή είναι η σημασιολογική ανάλυση η παραγωγή (ενδιάμεσου) κώδικα Η πρωταρχική δουλειά ενός σημασιολογικού αναλυτή είναι να επιβάλλει στατικούς σημασιολογικούς κανόνες (συνήθως στην αρχή) κατασκευάζει ένα δένδρο συντακτικής δομής η πληροφορία που συλλέγεται χρειάζεται στη γεννήτρια κώδικα Copyright © 2005 Elsevier
Ο Ρόλος της Σημασιολογικής Ανάλυσης Υπάρχει μια μεγάλη διαφοροποίηση ως προς το βαθμό που διαπλέκονται η συντακτική ανάλυση, η σημασιολογική ανάλυση και η παραγωγή ενδιάμεσου κώδικα Μια συνηθισμένη προσέγγιση συνδυάζει την κατασκευή του δένδρου συντακτικής δομής με τη συντακτική ανάλυση (χωρίς ρητό δένδρο συντακτικής δομής), και ακολουθούν ξεχωριστές φάσεις για τη σημασιολογική ανάλυση και την παραγωγή κώδικα Copyright © 2005 Elsevier
Ο Ρόλος της Σημασιολογικής Ανάλυσης Ο μεταγλωττιστής της PL/0 δεν έχει καμία βελτιστοποίηση (υπάρχει μόνο μια πολύ μικρή και τετριμμένη φάση που λειτουργεί στο δένδρο συντακτικής δομής) Η γεννήτρια κώδικα παράγει συμβολική γλώσσα για MIPS, όχι μια ενδιάμεση μορφή που να είναι ανεξάρτητη από τη μηχανή Copyright © 2005 Elsevier
Γραμματικές Χαρακτηριστικών Τόσο η σημασιολογική ανάλυση όσο και η παραγωγή του (ενδιάμεσου) κώδικα μπορούν να περιγραφούν ως διαδικασίες σχολιασμού ή «διακόσμησης» ενός δένδρου συντακτικής ανάλυσης ή συντακτικού δένδρου Οι ΓΡΑΜΜΑΤΙΚΕΣ ΧΑΡΑΚΤΗΡΙΣΤΙΚΩΝ παρέχουν ένα τυπικό πλαίσιο για τη διακόσμηση ενός δένδρου Οι παρακάτω σημειώσεις αναφέρονται στις γραμματικές χαρακτηριστικών και στις αυτοσχέδιες και συγγενικές τους ΡΟΥΤΙΝΕΣ ΕΝΕΡΓΕΙΩΝ Copyright © 2005 Elsevier
Γραμματικές Χαρακτηριστικών Θα αρχίσουμε με τη διακόσμηση των δένδρων συντακτικής ανάλυσης και στη συνέχεια θα ασχοληθούμε με τα συντακτικά δένδρα Θεωρήστε την εξής LR (ανοδική) γραμματική για αριθμητικές εκφράσεις που αποτελούνται από σταθερές, με κανόνες προτεραιότητας και προσεταιριστικότητας: Copyright © 2005 Elsevier
Γραμματικές Χαρακτηριστικών E E + T E E – T E T T T * F T T / F T F F - F F (E) F const Τα παραπάνω δε λένε τίποτα για τη ΣΗΜΑΣΙΑ του προγράμματος Copyright © 2005 Elsevier
Γραμματικές Χαρακτηριστικών Μπορούμε να τη μετατρέψουμε σε μια γραμματική χαρακτηριστικών με τον τρόπο που ακολουθεί (όπως στην Εικόνα 4.1): E E + T E1.val = E2.val + T.val E E – T E1.val = E2.val - T.val E T E.val = T.val T T * F T1.val = T2.val * F.val T T / F T1.val = T2.val / F.val T F T.val = F.val F - F F1.val = - F2.val F (E) F.val = E.val F const F.val = C.val Copyright © 2005 Elsevier
Γραμματικές Χαρακτηριστικών Σκοπός της γραμματικής χαρακτηριστικών είναι να ορίσει τη σημασιολογία του προγράμματος εισόδου Οι κανόνες χαρακτηριστικών πρέπει να θεωρούνται ορισμοί, όχι απόδοση τιμών Δεν είναι υποχρεωτικό να αποτιμηθούν κάποια συγκεκριμένη χρονική στιγμή ή με κάποια συγκεκριμένη σειρά, αν και ορίζουν το αριστερό μέλος τους σε σχέση με το δεξιό μέλος Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών Η διαδικασία του υπολογισμού χαρακτηριστικών ονομάζεται σχολιασμός ή ΔΙΑΚΟΣΜΗΣΗ του δένδρου συντακτικής ανάλυσης [βλ. Εικόνα 4.2 για το (1+3)*2] Αφού ολοκληρωθεί η διακόσμηση, η τιμή της έκφρασης βρίσκεται στο χαρακτηριστικό val της ρίζας του δένδρου Τα τμήματα κώδικα των κανόνων ονομάζονται ΣΗΜΑΣΙΟΛΟΓΙΚΕΣ ΣΥΝΑΡΤΗΣΕΙΣ Πιο αυστηρά, θα έπρεπε να θεωρούνται συναρτήσεις, π.χ., E1.val = sum (E2.val, T.val), βλ. Εικόνα 4.1 Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών Εικόνα 4.2 Διακόσμηση δένδρου συντακτικής ανάλυσης για την έκφραση (1 + 3) * 2. Τα χαρακτηριστικά val των συμβόλων φαίνονται ως ορθογώνια. Τα καμπύλα βέλη αντιπροσωπεύουν τη ροή των χαρακτηριστικών, που στην περίπτωση αυτή είναι πάντα ανοδική. Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών Εικόνα 4.2 Διακόσμηση δένδρου συντακτικής ανάλυσης για την έκφραση (1 + 3) * 2. Τα χαρακτηριστικά val των συμβόλων φαίνονται ως ορθογώνια. Τα καμπύλα βέλη αντιπροσωπεύουν τη ροή των χαρακτηριστικών, που στην περίπτωση αυτή είναι πάντα ανοδική. Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών Αυτή είναι μια πολύ απλή γραμματική χαρακτηριστικών: Κάθε σύμβολο έχει το πολύ ένα χαρακτηριστικό τα σύμβολα στίξης δεν έχουν χαρακτηριστικά Αυτά τα χαρακτηριστικά ονομάζονται ΣΥΝΘΕΤΙΚΑ: Υπολογίζονται μόνο από χαρακτηριστικά πραγμάτων που είναι πιο κάτω από αυτά στο δένδρο συντακτικής ανάλυσης Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών Γενικά, επιτρέπονται τα συνθετικά και τα ΚΛΗΡΟΝΟΜΗΜΕΝΑ χαρακτηριστικά: Τα κληρονομημένα χαρακτηριστικά μπορεί να εξαρτώνται από πληροφορίες «από επάνω» ή «από το πλάι» στο δένδρο συντακτικής ανάλυσης Οι λεκτικές μονάδες έχουν μόνο συνθετικά χαρακτηριστικά, που έχουν αρχικοποιηθεί από το λεκτικό αναλυτή (όνομα αναγνωριστικού, τιμή σταθεράς, κλπ.). Τα κληρονομημένα χαρακτηριστικά του αρχικού συμβόλου αποτελούν παραμέτρους του χρόνου εκτέλεσης του μεταγλωττιστή Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών Η παραπάνω γραμματική ονομάζεται συνθετική (S-ATTRIBUTED) γιατί χρησιμοποιεί μόνο συνθετικά χαρακτηριστικά Η ΡΟΗ ΧΑΡΑΚΤΗΡΙΣΤΙΚΩΝ (γράφος εξαρτήσεων των χαρακτηριστικών) είναι αμιγώς ανοδική Είναι SLR(1), αλλά όχι LL(1) Μια ισοδύναμη LL(1) γραμματική απαιτεί κληρονομημένα χαρακτηριστικά: Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών – Παράδειγμα Γραμματική χαρακτηριστικών στην Εικόνα 4.3: E T TT E.v = TT.v TT.st = T.v TT1 + T TT2 TT1.v = TT2.v TT2.st = TT1.st + T.v TT1 - T TT1 TT1.v = TT2.v TT2.st = TT1.st - T.v TT TT.v = TT.st T F FT T.v = FT.v FT.st = F.v Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών – Παράδειγμα Γραμματική χαρακτηριστικών στην Εικόνα 4.3 (συνέχεια): FT1 * F FT2 FT1.v = FT2.v FT2.st = FT1.st * F.v FT1 / F FT2 FT1.v = FT2.v FT2.st = FT1.st / F.v FT FT.v = FT.st F1 - F2 F1.v = - F2.v F ( E ) F.v = E.v F const F.v = C.v Εικόνα 4.4 – δένδρο συντακτικής ανάλυσης για το (1+3)*2 Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών – Παράδειγμα Εικόνα 4.4 Διακόσμηση του δένδρου καθοδικής συντακτικής ανάλυσης για την έκφραση (1 + 3) * 2, με τη γραμματική χαρακτηριστικών της Εικόνας 4.3. Τα καμπύλα βέλη αναπαριστούν και πάλι τη ροή χαρακτηριστικών, που δεν είναι πια ανοδική αλλά εξακολουθεί να είναι από αριστερά προς τα δεξιά. Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών – Παράδειγμα Γραμματική χαρακτηριστικών στην Εικόνα 4.3: Αυτή η γραμματική χαρακτηριστικών είναι πιο πολύπλοκη από την πρώτη αλλά είναι ακόμα αριστερή (L-ATTRIBUTED), που σημαίνει ότι τα χαρακτηριστικά μπορούν να υπολογιστούν με μια απλή διάσχιση της εισόδου από αριστερά προς τα δεξιά Μπορούν να υπολογιστούν κατά τη συντακτική ανάλυση LL Κάθε συνθετικό χαρακτηριστικό ενός συμβόλου στο αριστερό μέλος εξαρτάται μόνο από χαρακτηριστικά συμβόλων του δεξιού μέλους Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών – Παράδειγμα Γραμματική χαρακτηριστικών στην Εικόνα 4.3: Κάθε κληρονομημένο χαρακτηριστικό ενός συμβόλου στο δεξιό μέλος (ορισμός L-attributed) εξαρτάται μόνο από κληρονομημένα χαρακτηριστικά του συμβόλου στο αριστερό μέλος, ή συνθετικά ή κληρονομημένα χαρακτηριστικά των συμβόλων που βρίσκονται στα αριστερά του, στο δεξιό μέλος Οι συνθετικές γραμματικές είναι η πιο γενική κατηγορία γραμματικών χαρακτηριστικών για τις οποίες ο υπολογισμός μπορεί να γίνει επιτόπου κατά τη συντακτική ανάλυση LL Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών Υπάρχουν ορισμένες εργασίες, όπως η παραγωγή κώδικα για «βραχυκυκλωμένες» λογικές εκφράσεις, τις οποίες διεκπεραιώνουμε καλύτερα με μια μη αριστερή μέθοδο μετάφρασης Όμως, λόγω του πιθανού κόστους των πολύπλοκων τρόπων διάσχισης, οι περισσότεροι μεταγλωττιστές επιμένουν σε μια αριστερή γραμματική Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών – Συντακτικά Δένδρα Εικόνα 4.5 Ανοδική γραμματική χαρακτηριστικών για την κατασκευή συντακτικού δένδρου. Το σύμβολο +/- χρησιμοποιείται (όπως στις αριθμομηχανές) για την αντιστροφή του προσήμου. Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών – Συντακτικά Δένδρα Εικόνα 4.6 Καθοδική γραμματική χαρακτηριστικών για την κατασκευή συντακτικού δένδρου. Εδώ το χαρακτηριστικό st, όπως το χαρακτηριστικό ptr (και αντίθετα με το χαρακτηριστικό st της Εικόνας 4.3), είναι δείκτης προς έναν κόμβο του συντακτικού δένδρου. Copyright © 2005 Elsevier
Υπολογισμός Χαρακτηριστικών – Συντακτικά Δένδρα Εικόνα 4.7 Κατασκευή του συντακτικού δένδρου με διακόσμηση ενός δένδρου ανοδικής συντακτικής ανάλυσης, με τη γραμματική της Εικόνας 4.5. Στο διάγραμμα (α) οι τιμές των σταθερών 1 και 3 έχουν τοποθετηθεί σε νέα φύλλα του συντακτικού δένδρου. Δείκτες προς αυτά τα φύλλα διαδίδονται προς τα πάνω στα χαρακτηριστικά τωνE και T. Στο (β), οι δείκτες προς αυτά τα φύλλα γίνονται δείκτες-παιδιά ενός νέου εσωτερικού κόμβου +. Στο (γ), ο δείκτης προς αυτόν τον κόμβο διαδίδεται προς τα επάνω στα χαρακτηριστικά του T, και δημιουργείται ένα νέο φύλλο για το 2. Τέλος, στο (δ) οι δείκτες από τα T και F γίνονται δείκτες-παιδιά ενός νέου εσωτερικού κόμβου x, και ένας δείκτης προς αυτόν τον κόμβο διαδίδεται προς τα πάνω στα χαρακτηριστικά του E. Εικόνα 4.8 Κατασκευή συντακτικού δένδρου με διακόσμηση του δένδρου καθοδικής συντακτικής ανάλυσης, με τη γραμματική της Εικόνας 4.6. Στο επάνω διάγραμμα, (α), η τιμή της σταθεράς 1 έχει τοποθετηθεί σε ένα νέο φύλλο του συντακτικού δένδρου. Ένας δείκτης προς αυτό το φύλλο διαδίδεται στη συνέχεια στο χαρακτηριστικό st του TT. Στο (β), έχει δημιουργηθεί ένα δεύτερο φύλλο για τη σταθερά 3. Οι δείκτες προς αυτά τα δύο φύλλα γίνονται μετά δείκτες-παιδιά ενός νέου εσωτερικού κόμβου +, ένας δείκτης στον οποίο διαδίδεται από το χαρακτηριστικό st του κατώτατου TT, όπου δημιουργήθηκε, προς τα επάνω και μέχρι το χαρακτηριστικό st του κορυφαίου FT. Στο (β), ένα τρίτο φύλλο έχει δημιουργηθεί για τη σταθερά 2. Δείκτες προς αυτό το φύλλο και προς τον κόμβο + έχουν γίνει τα παιδιά ενός νέου κόμβου x, ένας δείκτης προς τον οποίο διαδίδεται από το st του κατώτατου FT, όπου δημιουργήθηκε, μέχρι τη ρίζα του δένδρου. Copyright © 2005 Elsevier
Ρουτίνες Ενεργειών Μπορούμε να συνδέσουμε αυτήν τη συζήτηση με το προηγούμενο θέμα των ξεχωριστών φάσεων και της επιτόπου σημασιολογικής ανάλυσης και/ή παραγωγής κώδικα Αν η σημασιολογική ανάλυση και/ή η παραγωγή του κώδικα διαπλέκονται με τη συντακτική ανάλυση, τότε η ΜΕΘΟΔΟΣ ΜΕΤΑΦΡΑΣΗΣ που χρησιμοποιούμε για να υπολογίσουμε τα χαρακτηριστικά πρέπει να είναι αριστερή Copyright © 2005 Elsevier
Ρουτίνες Ενεργειών Αν σπάσουμε τη σημασιολογική ανάλυση και την παραγωγή κώδικα σε ξεχωριστές φάσεις, τότε ο κώδικας που κατασκευάζει το συντακτικό δένδρο ή το δένδρο συντακτικής ανάλυσης πρέπει να χρησιμοποιεί μέθοδο μετάφρασης από τα αριστερά προς τα δεξιά Όμως, οι επόμενες φάσεις μπορούν να χρησιμοποιήσουν μια πιο περίπλοκη μέθοδο μετάφρασης αν αυτό είναι επιθυμητό Copyright © 2005 Elsevier
Ρουτίνες Ενεργειών Υπάρχουν αυτόματα εργαλεία που κατασκευάζουν μεθόδους μετάφρασης για γραμματικές ελεύθερες από συμφραζόμενα ή δενδρικές γραμματικές (που περιγράφουν την πιθανή δομή ενός συντακτικού δένδρου) Αυτά τα εργαλεία είναι δημοφιλή στους διορθωτές κειμένου που βασίζονται στη σύνταξη και στους αυξητικούς μεταγλωττιστές Οι περισσότεροι συνηθισμένοι μεταγλωττιστές όμως, χρησιμοποιούν αυτοσχέδιες τεχνικές Copyright © 2005 Elsevier
Ρουτίνες Ενεργειών Μια αυτοσχέδια μέθοδος μετάφρασης που επικαλύπτεται με τη συντακτική ανάλυση παίρνει τη μορφή ενός συνόλου από ΡΟΥΤΙΝΕΣ ΕΝΕΡΓΕΙΩΝ: Μια ρουτίνα ενεργειών είναι μια σημασιολογική συνάρτηση που ο προγραμματιστής ορίζει στο μεταγλωττιστή να εκτελεί σε κάποιο συγκεκριμένο σημείο της συντακτικής ανάλυσης Αν η σημασιολογική ανάλυση επικαλύπτεται με την παραγωγή κώδικα, τότε οι ρουτίνες ενεργειών μπορούν να χρησιμοποιηθούν για να εκτελούν σημασιολογικούς ελέγχους ή να παράγουν κώδικα Copyright © 2005 Elsevier
Ρουτίνες Ενεργειών Αν η σημασιολογική ανάλυση και η παραγωγή κώδικα διαχωριστούν σε ξεχωριστές φάσεις, τότε οι ρουτίνες ενεργειών μπορούν να χρησιμοποιηθούν για να κατασκευαστεί ένα συντακτικό δένδρο Ένα δένδρο συντακτικής ανάλυσης μπορεί να κατασκευαστεί εντελώς αυτόματα Δε χρειαζόμαστε ρουτίνες ενεργειών για αυτόν το σκοπό Copyright © 2005 Elsevier
Ρουτίνες Ενεργειών Μεταγενέστερες φάσεις της μεταγλώττισης μπορούν να αποτελούνται από αυτοσχέδιες διασχίσεις δένδρων ή μπορούν να χρησιμοποιούν ένα αυτόματο εργαλείο για την παραγωγή μιας μεθόδου μετάφρασης Ο μεταγλωττιστής της PL/0 χρησιμοποιεί αυτοσχέδιες διασχίσεις που είναι σχεδόν (αλλά όχι εντελώς) από αριστερά προς τα δεξιά Για τη LL(1) γραμματική χαρακτηριστικών μας, θα μπορούσαμε να βάλουμε ρητές ρουτίνες ενεργειών ως εξής: Copyright © 2005 Elsevier
Ρουτίνες Ενεργειών - Παράδειγμα Ρουτίνες Ενεργειών (Εικόνα 4.9) Εικόνα 4.9 Γραμματική LL(1) με ρουτίνες ενεργειών για την κατασκευή συντακτικού δένδρου. Copyright © 2005 Elsevier
Διαχείριση Χώρου για τα Χαρακτηριστικά Οι εγγραφές στη στοίβα των χαρακτηριστικών τοποθετούνται και αφαιρούνται αυτόματα Εικόνα 4.10 Γραμματική χωρίς συμφραζόμενα για τη γλώσσα της αριθμομηχανής με τύπους και δηλώσεις. Στόχος είναι κάθε αναγνωριστικό να δηλώνεται πριν από τη χρήση του, και να μην αναμιγνύονται οι τύποι στους υπολογισμούς. Copyright © 2005 Elsevier
Διακόσμηση του Συντακτικού Δένδρου Συντακτικό δένδρο για ένα απλό πρόγραμμα που τυπώνει το μέσο όρο ενός ακεραίου και ενός πραγματικού Εικόνα 4.11 Συντακτικό δένδρο για ένα απλό πρόγραμμα αριθμομηχανής. Copyright © 2005 Elsevier
Διακόσμηση του Συντακτικού Δένδρου Δενδρική γραμματική που απεικονίζει τη δομή του συντακτικού δένδρου στην Εικόνα 4.11 Copyright © 2005 Elsevier
Διακόσμηση του Συντακτικού Δένδρου Απόσπασμα από μια πλήρη δενδρική γραμματική που απεικονίζει τη δομή του συντακτικού δένδρου στην Εικόνα 4.11 Copyright © 2005 Elsevier