ΘΠ06 - Μεταγλωττιστές

16
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων

description

ΘΠ06 - Μεταγλωττιστές. Πίνακας Συμβόλων. Πίνακας Συμβόλων (Symbol Table) (Ι). Ε ίναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματος και οι πληροφορίες για αυτά Είδη ονομάτων είναι τα εξής : το ίδιο το πρόγραμμα μεταβλητές συναρτήσεις / διαδικασίες - PowerPoint PPT Presentation

Transcript of ΘΠ06 - Μεταγλωττιστές

Page 1: ΘΠ06 - Μεταγλωττιστές

ΘΠ06 - Μεταγλωττιστές

Πίνακας Συμβόλων

Page 2: ΘΠ06 - Μεταγλωττιστές

Πίνακας Συμβόλων (Symbol Table) (Ι)Είναι μια δομή στην οποία αποθηκεύονται τα ονόματα

ενός προγράμματος και οι πληροφορίες για αυτά

Είδη ονομάτων είναι τα εξής: το ίδιο το πρόγραμμα μεταβλητές συναρτήσεις / διαδικασίες ετικέτες εντολών, στις οποίες επιτρέπεται η μετάβαση με

εντολές, όπως η goto σταθερές τύποι δεδομένων, κ.α.

Page 3: ΘΠ06 - Μεταγλωττιστές

Πίνακας Συμβόλων (Symbol Table) (ΙΙ)Είδη πληροφορίας είναι οι εξής:

εμβέλεια γραμμή (δήλωσης/ορισμού ονόματος) τύπος τρόπος περάσματος σε συνάρτηση (με αναφορά ή

κατ’ αξία) τυπικές παράμετροι συνάρτησης, αριθμός τυπικών

παραμέτρων κατηγορία αποθήκευσης (στοίβας, στατική, σωρού)

Page 4: ΘΠ06 - Μεταγλωττιστές

Πίνακας Συμβόλων (Symbol Table) (ΙΙΙ)Ο πίνακας συμβόλων χρησιμοποιείται σε διάφορα

στάδια της μεταγλώττισης

Λεκτική ανάλυση (σπάνια)Όταν συναντάται κάποιο όνομα / σταθερά

Σημασιολογική ανάλυσηΌταν συναντάται κάποιο όνομαΌταν αποτιμάται ο τύπος μίας έκφρασης

Παραγωγή ενδιάμεσου κώδικαΌταν παράγονται τετράδες για εντολές

Page 5: ΘΠ06 - Μεταγλωττιστές

Περιεχόμενα του Πίνακα ΣυμβόλωνΜεταβλητές

όνομα τύπος εμβέλεια (scope)

Συναρτήσεις όνομα επιστρεφόμενος τύπος ορίσματα / αριθμός ορισμάτων εμβέλεια

Page 6: ΘΠ06 - Μεταγλωττιστές

Οργάνωση του Πίνακα Συμβόλων Insert

Εισαγωγή ενός νέου συμβόλου στον πίνακα

lup Αναζήτηση ενός συμβόλου στον πίνακα

del Διαγραφή ενός ονόματος ή μιας ομάδας ονομάτων

Page 7: ΘΠ06 - Μεταγλωττιστές

Εισαγωγή - ΑναζήτησηΚάθε φορά που αναγνωρίζεται ένα όνομα

δημιουργείται μία νέα εγγραφή για αυτό στον πίνακα συμβόλων, εφόσον δεν υπάρχει ήδη κατά τη δήλωση μιας νέας μεταβλητής ή συνάρτησης

Αναζήτηση ενός ονόματος στο τρέχον επίπεδο εμβέλειας ή σε περιέχουσα εμβέλεια με βάση τη σημασιολογία της γλώσσας κατά τον ορισμό ενός συμβόλου κατά τη χρήση ενός συμβόλου

Page 8: ΘΠ06 - Μεταγλωττιστές

Διαγραφή Διαγραφή ενός ονόματος και των πληροφοριών του

το οποίο δεν χρειαζόμαστε πλέον κατά την έξοδο από κάποιο block

Page 9: ΘΠ06 - Μεταγλωττιστές

Παράδειγμα Χρήσης Πίνακα Συμβόλων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)

Page 10: ΘΠ06 - Μεταγλωττιστές

Υλοποίηση με Συνδεδεμένες ΛίστεςΗ απλούστερη και λιγότερο αποδοτική υλοποίησηΤα νέα ονόματα εισάγονται στη λίστα σύμφωνα με την

σειρά εμφάνισης στο πρόγραμμαΗ αναζήτηση απαιτεί να διατρέξουμε όλη την λίσταΣε ένα πίνακα συμβόλων με n ονόματα

κόστος εισαγωγής/αναζήτησης O(n)

bzcaxαρχη

y

Page 11: ΘΠ06 - Μεταγλωττιστές

Υλοποίηση με Δέντρα Δυαδικής Αναζήτησης (Ι)

c

b y

a x z

Page 12: ΘΠ06 - Μεταγλωττιστές

Υλοποίηση με Δέντρα Δυαδικής Αναζήτησης (II)Σε κάθε κόμβο x ο οποίος περιέχει το όνομα n(x)

όλοι οι αριστεροί κόμβοι y, περιέχουν ονόματα n(y) που προηγούνται του n(x) κατ’αλφαβητική σειρά

όλοι οι δεξιοί κόμβοι z, περιέχουν ονόματα n(z) που έπονται του n(x) κατ’αλφαβητική σειρά

Για να εισάγουμε ένα όνομα το συγκρίνουμε με αυτό του τρέχοντος κόμβου και ακολουθούμε το αντίστοιχο μονοπάτι

Σε ένα πίνακα συμβόλων με n ονόματα κόστος εισαγωγής/αναζήτησης O(log(n)

Μπορεί να μην είναι ισοζυγισμένο

Page 13: ΘΠ06 - Μεταγλωττιστές

Υλοποίηση με Πίνακα Κατακερματισμού (Ι)Ένας πίνακας κατακερματισμού αποτελείται από

k θέσεις (αριθμημένες από 0 εώς k-1) σε κάθε θέση υπάρχει ένας δείκτης στο αρχικό

στοιχείο μιας συνδεδεμένης λίστας κάθε όνομα n κατανέμεται σε μία από αυτές τις λίστες

με βάση μια hash συνάρτηση (h(n) = x, 0 ≤ x ≤ k-1) είναι πολύ χρήσιμο στην υλοποίηση σας να υπάρχει και

ένα scope link που δημιουργεί μία λίστα συνδέοντας όλα τα σύμβολα που ανήκουν στο ίδιο scope.

Σημείωση: αυτή η λίστα θα είναι μία δομή πάνω στην ήδη υπάρχουσα.

Page 14: ΘΠ06 - Μεταγλωττιστές

Υλοποίηση με Πίνακα Κατακερματισμού (ΙΙ)

Οι εγγραφές με το ίδιο χρώμα ανήκουν στο ίδιο scope.

0

1

2

.

.

.

k-1

Page 15: ΘΠ06 - Μεταγλωττιστές

ΕμβέλειαΈνας τρόπος διαχείρισης της εμβέλειας είναι να

αντιστοιχίσουμε σε κάθε εμβέλεια μοναδικό αριθμό εμβέλειας

Μια καθολική μεταβλητή μπορεί να δείχνει την τρέχουσα εμβέλεια η μεταβλητή αυτή θα πρέπει να αυξάνεται / μειώνεται

στις ενέργειες (actions) των γραμματικών κανόνωνΜόλις κλείσει μια εμβέλεια όλες οι καταχωρήσεις

με τον αριθμό που αντιστοιχεί στην εμβέλεια εξαλείφονται

Page 16: ΘΠ06 - Μεταγλωττιστές

Bison και Πίνακας ΣυμβόλωνΣε ένα αρχείο C/C++ υλοποιούμε τις δομές και

συναρτήσεις του πίνακα συμβόλωνΣτο αρχείο bison προσθέτουμε ενέργειες στους

κανόνες της γραμματικής έτσι ώστε: Να κάνουμε αναζήτηση του ονόματος στην τρέχουσα

(ή/και παραπάνω) εμβέλεια Να εισάγουμε το όνομα και τις πληροφορίες του στον

πίνακα συμβόλων (σε κανόνες δήλωσης μεταβλητής/συνάρτησης)

Να διαχειριζόμαστε την εμβέλεια (δημιουργία / διαγραφή)