Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεOeneus Caras Τροποποιήθηκε πριν 9 χρόνια
1
1 ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Πίνακας Συμβόλων Symbol Table
2
2 Τι είναι ο Symbol Table Ο πίνακας συμβόλων (symbol table) είναι μία δομή, όπου αποθηκεύεται πληροφορία σχετικά με τα σύμβολα (μεταβλητές και συναρτήσεις) του προγράμματος. Ο πίνακας συμβόλων προσπελαύνεται κάθε φορά που ο compiler συναντά κάποιο σύμβολο.
3
3 Ποια είναι η δουλειά του Symbol Table read(a);//< Σημασία των read, a? input(a);//< Σημασία του input? function foo(x)//< foo, x? { s = ”hy340”;//< s? } Ο compiler μας στο παραπάνω πρόγραμμα πρέπει να μπορεί να ξεχωρίσει τον τύπο του κάθε συμβόλου όταν το συναντά.
4
4 Περιεχόμενη Πληροφορία Μεταβλητή Όνομα Τύπος Εμβέλεια (scope) Γραμμή δήλωσης Συνάρτηση Όνομα Ορίσματα Εμβέλεια Γραμμή δήλωσης
5
5 Λειτουργίες του Symbol Table Insert Εισαγωγή ενός νέου συμβόλου στον πίνακα. Lookup Αναζήτηση ενός συμβόλου στον πίνακα. Hide Απενεργοποίηση (όχι διαγραφή) όλων των συμβόλων ενός επιπέδου εμβέλειας.
6
6 Insert Κάθε φορά που αναγνωρίζεται ένα σύμβολο δημιουργείται μία νέα εγγραφή για αυτό, εφόσον δεν υπάρχει ήδη στον symbol table. Πότε γίνεται; Κατά τον ορισμό μιας νέας μεταβλητής ή συνάρτησης Κατά την χρήση μη ορισμένου συμβόλου
7
7 Lookup Αναζήτηση ενός συμβόλου στο τρέχον επίπεδο εμβέλειας ή σε περιέχουσα εμβέλεια με βάση τη λογική των κανόνων που ακολουθεί η γλώσσα Πότε γίνεται; Κατά τον ορισμό ενός συμβόλου Κατά την χρήση ενός συμβόλου
8
8 Hide Απενεργοποίηση των μεταβλητών του επιπέδου εμβέλειας το οποίο δεν χρειαζόμαστε πλέον Πότε γίνεται; Κατά την έξοδο από κάποιο block Προσοχή: Ακύρωση τοπικών μεταβλητών και τυπικών ορισμάτων μιας συνάρτησης με την έξοδο από το block της συνάρτησης
9
9 Παράδειγμα Symbol Table - Χρήση συναρτήσεων input(x); lookup(input()), lookup(x), ins(x) g = 12.4; lookup(g), ins(g) print(typeof(x)); lookup(print()), lookup(typeof()), lookup(x) function foo(x,y) lookup(foo()), ins(foo()), ins(x), ins(y) { print(x+y); lookup(print()), lookup(x), lookup(y) local print = y; lookup(print), ins(print), lookup(y) ::print(print); lookup(::print()), lookup(print) function h(a) lookup(h()), ins(h()), ins(a) { return x+y+a; lookup(x), lookup(y), ins(y), lookup(a) } hide(h.a, h.y) y = h(::x); lookup(y), lookup(h()), lookup(::x) } hide(foo.x, foo.y, foo.print, foo.h())
10
10 Η Δομή varType Σε αυτή την δομή αποθηκεύεται πληροφορία σχετικά με τις μεταβλητές. typedef struct varType { name// το όνομα της μεταβλητής type// ο τύπος της μεταβλητής scope level// εμβέλεια μεταβλητής declLine// γραμμή δήλωσης μεταβλητής } varType;
11
11 Η Δομή funType Σε αυτή την δομή αποθηκεύεται πληροφορία σχετικά με τις συναρτήσεις. typedef struct funType { name// το όνομα της συνάρτησης arguments// ορίσματα συνάρτησης scope level// εμβέλεια συνάρτησης declLine// γραμμή δήλωσης συνάρτησης } varType;
12
12 Η εγγραφή στον πίνακα συμβόλων Κάθε εγγραφή στον πίνακα συμβόλων είναι για την δήλωση ενός συμβόλου. typedef struct symbolTableRecord { bool isActive;// είναι ενεργό σύμβολο; union { varType* p_var; funTtype* p_fun; } types; enum symbolType;// αν το σύμβολο είναι // μεταβλητή ή συνάρτηση } symbolTableRecord;
13
13 Υλοποίηση Πίνακα Συμβόλων Υπάρχουν δύο τρόποι υλοποίησης του πίνακα συμβόλων: Linked List Hash Table Προτιμήστε η υλοποίηση με Hashtable κυρίως λόγω της επίδοσης του LookUp.
14
14 Υλοποίηση Πίνακα Συμβόλων με Hashtable (1/2) Ένας Hashtable αποτελείται από m buckets. Κάθε σύμβολο κατανέμεται σε ένα από αυτά τα buckets με βάση μια hash συνάρτηση. Σύμβολα που τυχαίνει να πέσουν στο ίδιο bucket δημιουργούν ένα linked list. Επιπλέον είναι πολύ χρήσιμο στην υλοποίηση σας να υπάρχει και ένα scope link που δημιουργεί μία λίστα συνδέοντας όλα τα σύμβολα που ανήκουν στο ίδιο scope. Σημείωση: αυτή η λίστα θα είναι μία δομή πάνω στην ήδη υπάρχουσα.
15
15 Υλοποίηση Πίνακα Συμβόλων με Hashtable (2/2) Οι εγγραφές με το ίδιο χρώμα ανήκουν στο ίδιο scope.
16
16 Συναρτήσεις χειρισμού Οι συναρτήσεις Insert και LookUp είναι όμοιες με αυτές που έχετε υλοποιήσει σε προηγούμενα μαθήματα για έναν Hashtable, με την διαφορά ότι πρέπει να γίνει ο χειρισμός του scope link. Η συνάρτηση Hide θα «ακολουθεί» το scope link για μία συγκεκριμένη εμβέλεια και θα ακυρώνει αυτά τα σύμβολα.
17
17 Χώροι Εμβέλειας Ένας τρόπος χειρισμού των χώρων εμβέλειας είναι να υπάρχει μία καθολική μεταβλητή που να δείχνει την εμβέλεια στην οποία βρισκόμαστε. Στα actions των κατάλληλων γραμματικών κανόνων θα πρέπει να αυξάνεται ή να μειώνεται αυτή η μεταβλητή.
18
18 Type Checking (1/3) Redefine Όταν υπάρχει ήδη μια μεταβλητή με id ίδιο με το id της μεταβλητής που πάμε να ορίσουμε στο ίδιο επίπεδο εμβέλειας. Undefine Όταν μια μεταβλητή που χρησιμοποιείται δεν είναι στον πίνακα συμβόλων στο επίπεδο εμβέλειας στο οποίο θα έπρεπε να βρίσκεται.
19
19 Type Checking (2/3) Στη γλώσσα alpha Redefine global μεταβλητή με ίδιο όνομα με κάποια συνάρτηση βιβλιοθήκης Undefine Οι μεταβλητές που δεν υπάρχουν στον πίνακα συμβόλων ορίζονται με την πρώτη εμφάνισή τους (εισάγονται στον symbol table) Όταν ζητάμε global μεταβλητή η οποία δεν έχει οριστεί και άρα δεν υπάρχει στον symbol table (error)
20
20 Type Checking (3/3) read(a);// νέα συνάρτηση read() και μεταβλητή a input(a); function foo(x) // definition συνάρτησης foo() { s = ”hy340”;// νέα μεταβλητή s print(x+y);// νέα μεταβλητή y local hello = a;// δήλωση νέας local μεταβλητής hello function hello()// redefined hello, error { if(a > 10) print(::a + x);// νέα μεταβλητή x } sqrt(s); y = cos(::y);// error: undefined ::y }
21
21 Παράδειγμα Symbol Table – Yacc (1/2) … %union { char* s_type; …. } %type ID … % …
22
22 Παράδειγμα Symbol Table – Yacc (2/2) lvalue: ::ID {p = LookUp($2, 0); // Αναζήτηση ID στη καθολική εμβέλεια if(p == null) { //error } | … block: ‘{’ {++scope;} stmts ‘}’ {Hide(scope--);}
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.