170 likes | 341 Views
ΘΠ06 - Μεταγλωττιστές. Πίνακας Συμβόλων. Πίνακας Συμβόλων (Symbol Table) (Ι). Ε ίναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματος και οι πληροφορίες για αυτά Είδη ονομάτων είναι τα εξής : το ίδιο το πρόγραμμα μεταβλητές συναρτήσεις / διαδικασίες
E N D
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων
Πίνακας Συμβόλων (Symbol Table) (Ι) • Είναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματοςκαι οι πληροφορίεςγια αυτά • Είδη ονομάτων είναι τα εξής: • το ίδιο το πρόγραμμα • μεταβλητές • συναρτήσεις / διαδικασίες • ετικέτες εντολών,στις οποίες επιτρέπεται η μετάβαση με εντολές, όπως η goto • σταθερές • τύποι δεδομένων, κ.α.
Πίνακας Συμβόλων (Symbol Table) (ΙΙ) • Είδη πληροφορίας είναι οι εξής: • εμβέλεια • γραμμή (δήλωσης/ορισμού ονόματος) • τύπος • τρόπος περάσματος σε συνάρτηση (με αναφορά ή κατ’ αξία) • τυπικές παράμετροι συνάρτησης, αριθμός τυπικών παραμέτρων • κατηγορία αποθήκευσης (στοίβας, στατική, σωρού)
Πίνακας Συμβόλων (Symbol Table) (ΙΙΙ) • Ο πίνακας συμβόλων χρησιμοποιείται σε διάφορα στάδια της μεταγλώττισης • Λεκτική ανάλυση (σπάνια) • Όταν συναντάται κάποιο όνομα / σταθερά • Σημασιολογική ανάλυση • Όταν συναντάται κάποιο όνομα • Όταν αποτιμάται ο τύπος μίας έκφρασης • Παραγωγή ενδιάμεσου κώδικα • Όταν παράγονται τετράδες για εντολές
Περιεχόμενα του Πίνακα Συμβόλων • Μεταβλητές • όνομα • τύπος • εμβέλεια (scope) • Συναρτήσεις • όνομα • επιστρεφόμενος τύπος • ορίσματα / αριθμός ορισμάτων • εμβέλεια
Οργάνωση του Πίνακα Συμβόλων • Insert • Εισαγωγή ενός νέου συμβόλου στον πίνακα • lup • Αναζήτηση ενός συμβόλου στον πίνακα • del • Διαγραφή ενός ονόματος ή μιας ομάδας ονομάτων
Εισαγωγή - Αναζήτηση • Κάθε φορά που αναγνωρίζεται ένα όνομα δημιουργείται μία νέα εγγραφή για αυτόστον πίνακα συμβόλων, εφόσον δεν υπάρχει ήδη • κατά τη δήλωση μιας νέας μεταβλητής ή συνάρτησης • Αναζήτηση ενός ονόματος στο τρέχον επίπεδο εμβέλειας ή σε περιέχουσα εμβέλεια με βάση τη σημασιολογία της γλώσσας • κατά τον ορισμό ενός συμβόλου • κατά τη χρήση ενός συμβόλου
Διαγραφή • Διαγραφή ενός ονόματος και των πληροφοριών του το οποίο δεν χρειαζόμαστε πλέον • κατά την έξοδο από κάποιο block
Παράδειγμα Χρήσης Πίνακα Συμβόλων • float g; • g = 12.4; • writeString(typeof(x)); • int foo(int x, int y){ • writeInt(x+y); • int print = y; • writeInt(print); • int h(int a) { • return x+y+a; • } • y = h(x); • } • lup(g),ins(g) • lup(g) • lup(writeString()),lup(typeof()), • lup(x) • lup(foo()),ins(foo()),ins(x),ins(y) • lup(writeInt()), lup(x), lup(y) • lup(print), ins(print), lup(y) • lup(writeInt()), lup(print) • lup(h()), ins(h()), ins(a) • lup(x), lup(y), lup(a) • del(h.a) • lup(y), lup(h()), lup(x) • del(foo.x), del(foo.y), • del(foo.print), del(foo.h)
y b z c a αρχη x Υλοποίηση με Συνδεδεμένες Λίστες • Η απλούστερη και λιγότερο αποδοτική υλοποίηση • Τα νέα ονόματα εισάγονται στη λίστα σύμφωνα με την σειρά εμφάνισης στο πρόγραμμα • Η αναζήτηση απαιτεί να διατρέξουμε όλη την λίστα • Σε ένα πίνακα συμβόλων με n ονόματα • κόστος εισαγωγής/αναζήτησης O(n)
Υλοποίηση με Δέντρα Δυαδικής Αναζήτησης (Ι) c b y a x z
Υλοποίηση με Δέντρα Δυαδικής Αναζήτησης (II) • Σε κάθε κόμβο x ο οποίος περιέχει το όνομα n(x) • όλοι οι αριστεροί κόμβοι y, περιέχουν ονόματα n(y) που προηγούνται του n(x) κατ’αλφαβητική σειρά • όλοι οι δεξιοί κόμβοι z, περιέχουν ονόματα n(z) που έπονται του n(x) κατ’αλφαβητική σειρά • Για να εισάγουμε ένα όνομα το συγκρίνουμε με αυτό του τρέχοντος κόμβου και ακολουθούμε το αντίστοιχο μονοπάτι • Σε ένα πίνακα συμβόλων με n ονόματα • κόστος εισαγωγής/αναζήτησης O(log(n) • Μπορεί να μην είναι ισοζυγισμένο
Υλοποίηση με Πίνακα Κατακερματισμού (Ι) • Ένας πίνακας κατακερματισμού αποτελείται από k θέσεις (αριθμημένες από 0 εώς k-1) • σε κάθε θέση υπάρχει ένας δείκτης στο αρχικό στοιχείο μιας συνδεδεμένης λίστας • κάθε όνομα n κατανέμεται σε μία από αυτές τις λίστες με βάση μια hash συνάρτηση (h(n) = x, 0 ≤ x ≤ k-1) • είναι πολύ χρήσιμο στην υλοποίηση σας να υπάρχει και ένα scope link που δημιουργεί μία λίστα συνδέοντας όλα τα σύμβολα που ανήκουν στο ίδιο scope. • Σημείωση: αυτή η λίστα θα είναι μία δομή πάνω στην ήδη υπάρχουσα.
Υλοποίηση με Πίνακα Κατακερματισμού (ΙΙ) 0 1 Οι εγγραφές με το ίδιο χρώμα ανήκουν στο ίδιο scope. 2 . . . k-1
Εμβέλεια • Ένας τρόπος διαχείρισης της εμβέλειας είναι να αντιστοιχίσουμε σε κάθε εμβέλεια μοναδικό αριθμό εμβέλειας • Μια καθολική μεταβλητή μπορεί να δείχνει την τρέχουσα εμβέλεια • η μεταβλητή αυτή θα πρέπει να αυξάνεται / μειώνεται στις ενέργειες(actions) των γραμματικών κανόνων • Μόλις κλείσει μια εμβέλεια όλες οι καταχωρήσεις με τον αριθμό που αντιστοιχεί στην εμβέλεια εξαλείφονται
Bison και Πίνακας Συμβόλων • Σε ένα αρχείο C/C++ υλοποιούμε τις δομές και συναρτήσεις του πίνακα συμβόλων • Στο αρχείο bison προσθέτουμε ενέργειες στους κανόνες της γραμματικής έτσι ώστε: • Να κάνουμε αναζήτηση του ονόματος στην τρέχουσα (ή/και παραπάνω) εμβέλεια • Να εισάγουμε το όνομα και τις πληροφορίες του στον πίνακα συμβόλων (σε κανόνες δήλωσης μεταβλητής/συνάρτησης) • Να διαχειριζόμαστε την εμβέλεια (δημιουργία / διαγραφή)