Ο πίνακας συμβόλων (symbol table) είναι μία δομή, όπου αποθηκεύεται πληροφορία σχετικά με τα σύμβολα του προγράμματος



Σχετικά έγγραφα
Slide 6 / 43. Slide 5 / 43. Α. Σαββίδης. Α. Σαββίδης. Slide 8 / 43. Slide 7 / 43. Α. Σαββίδης. Α. Σαββίδης HY340, 2009 HY340, 2009 HY340, 2009

Τι είναι ο Symbol Table. ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο. Περιεχόμενη Πληροφορία. Table. Πίνακας Συμβόλων

Μεταγλωττιστές. Συντακτικός Αναλυτής Κατασκευή Πίνακα Συμβόλων (ΠΣ) Εργαστήριο 7. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΗΥ340

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΗΥ340

HY340, 2009 Α. Σαββίδης Slide 2 / 143. HY340, 2009 Α. Σαββίδης Slide 3 / 143. HY340, 2009 Α. Σαββίδης Slide 4 / 143

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

a = false; else a = 3.33; b = (a and c); //?

Runtime Checking (1/3) Runtime Checking (2/3) Runtime Checking (3/3) ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Διάλεξη 23: Τεχνικές Κατακερματισμού II (Hashing)

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Εισαγωγή στον Προγραμματισμό με C++

Φροντιστήριο 1ο Εισαγωγή στο FLEX. Flex. Regular Expressions (1/4)

Διάλεξη 22η: Επιπλέον στοιχεία της C

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Στοιχειώδης προγραμματισμός σε C++

Δομημένος Προγραμματισμός

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 1o Μέρος


Εισαγωγή στον Προγραμματισμό

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Φροντιστήριο 3 ο Παραγωγή Ενδιάμεσου Κώδικα. Σημασιολογία της γλώσσας alpha (1/7) Type Checking

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Δομές Δεδομένων

Διαδικασιακός Προγραμματισμός

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Δομημένος Προγραμματισμός

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

Φροντιστήριο 4 Σκελετοί Λύσεων

Διάλεξη 5: Δείκτες και Συναρτήσεις

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 10 Ο. Δομές Ενώσεις Απαριθμητοί τύποι δεδομένων ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Η βασική συνάρτηση προγράμματος main()

Pascal. 15 Νοεμβρίου 2011

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Γ7.2 Συμβολοσειρές (Strings) Γ Λυκείου Κατεύθυνσης

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Λογικές εκφράσεις και μεταβλητές

Διδάσκων: Παναγιώτης Ανδρέου

Standard Template Library (STL) C++ library

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

HY150a Φροντιστήριο 3 24/11/2017

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Εισαγωγή στο Flex. Μεταγλωττιστές, Χειμερινό εξάμηνο

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

B. Ενσωμάτωση Ιθαγενών Μεθόδων

HY240 : Δομές Δεδομένων. Φροντιστήριο Προγραμματιστικής Εργασίας 2 ο και 3 ο Μέρος

Προγραμματισμός Ι. Δομές & Ενώσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Προγραμματισμός Η/Υ (ΤΛ2007 )

HY340, 2010 Α. Σαββίδης. Slide 3 / 43. Slide 4 / 43

Μεθόδων Επίλυσης Προβλημάτων

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

Περιεχόμενα. Πρόλογος... 17

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Προγραµµατιστικές Τεχνικές

Ανάπτυξη και Σχεδίαση Λογισμικού

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

'Ασκηση 1: Στατικός Κατακερματισμός. Εισαγωγή. Ρουτίνες υλοποίησης κατακερματισμού. (Ημερομηνία Παράδοσης: Παρασκευή, 16/5/2008, 5μμ) HT_Init()

Κεφάλαιο 3.1, : Συναρτήσεις I. (Διάλεξη 11)

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Εισαγωγή στον Προγ/μό Υπολογιστών

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Ηβασικήσυνάρτηση προγράμματος main()

Μεθόδων Επίλυσης Προβλημάτων

Διάλεξη 22: Τεχνικές Κατακερματισμού I (Hashing)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Γιάννης Σαμωνάκης. 1 ο ΣΧΟΛΕΙΟ ΚΩΔΙΚΑ «Βασικά Θέματα Προγραμματισμού στην Ανάπτυξη Δυναμικών Διαδικτυακών Εφαρμογών» (Part 4 - PHP)

Προγραμματισμό για ΗΜΥ

Σημειωματάριο Δευτέρας 30 Οκτ. 2017

Εισαγωγή στον Προγραμματισμό

Προγραμματισμό για ΗΜΥ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Κατακερματισμός. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Transcript:

HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ Φροντιστήριο 3 ο Symbol Table & Scopes Ι ΑΣΚΩΝ Αντώνιος Σαββίδης HY340, 2012 Α. Σαββίδης Slide 2 / 22 Τι είναι ο Symbol Table Ο πίνακας συμβόλων (symbol table) είναι μία δομή, όπου αποθηκεύεται πληροφορία σχετικά με τα σύμβολα του προγράμματος Είδος συμβόλου (μεταβλητή ή συνάρτηση) Scope (εμβέλεια) του συμβόλου Ο πίνακας συμβόλων προσπελαύνεται κάθε φορά που ο compiler συναντά κάποιο σύμβολο Ορισμός νέων συμβόλων Εύρεση υπαρχόντων συμβόλων Δεδομένα Symbol Table (1/2) Μεταβλητές Όνομα Τύπος Καθολική μεταβλητή, τυπικό όρισμα ή τοπική μεταβλητή Εμβέλεια (scope) Γραμμή δήλωσης Συναρτήσεις Όνομα Τύπος Συνάρτηση προγραμματιστή, ή βιβλιοθήκης Τυπικά ορίσματα Εμβέλεια (scope) Γραμμή δήλωσης HY340, 2012 Α. Σαββίδης Slide 3 / 22 HY340, 2012 Α. Σαββίδης Slide 4 / 22

Δεδομένα Symbol Table Παράδειγμα (2/2) Λειτουργίες Symbol Table (1/5) 1. x = input(); 2. function g(x, y) { 3. local z = x + y; 4. print(z); 5. return(function f(a, b) { 6. return a + b; 7. ); 8. x: global variable at scope 0, line 1 input: library function at scope 0, line 0 g: user defined function with arguments x, y, at scope 0, line 2 x, y: formal arguments at scope 1, line 2 z: local variable at scope 1, line 3 print: library function at scope 0, line 0 f: user defined function with arguments a, b, at scope 1, line 5 a, b: formal arguments at scope 2, line 5 Insert Εισαγωγή ενός νέου συμβόλου στον πίνακα Lookup Αναζήτηση ενός συμβόλου στον πίνακα Hide Απενεργοποίηση (όχι διαγραφή) όλων των συμβόλων ενός επιπέδου εμβέλειας HY340, 2012 Α. Σαββίδης Slide 5 / 22 HY340, 2012 Α. Σαββίδης Slide 6 / 22 Λειτουργίες Symbol Table Insert (2/5) Όποτε αναγνωρίζεται ένα σύμβολο δημιουργείται μία νέα εγγραφή για αυτό, εφόσον δεν υπάρχει ήδη στον symbol table Πότε γίνεται; Κατά τον ορισμό νέας μεταβλητής, π.χ. local x; Εκτός φυσικά αν αναφέρεται σε μεταβλητή ή συνάρτηση στο ίδιο scope Κατά τον ορισμό νέας συνάρτησης, π.χ. function foo(x, y) { return x+y; Κατά την χρήση μη ορισμένου συμβόλου, πχ. x = input() Λειτουργίες Symbol Table Lookup (3/5) Αναζήτηση ενός συμβόλου στο τρέχον επίπεδο εμβέλειας ή σε περιέχουσα εμβέλεια με βάση τους κανόνων που ακολουθεί η γλώσσα Πότε γίνεται; Κατά τον ορισμό ενός συμβόλου Για να ελέγξουμε ότι δεν υπάρχει σύγκρουση με κάποιο ήδη υπάρχον σύμβολο Κατά την χρήση ενός συμβόλου Για να βρούμε το σύμβολο στο οποίο αναφερόμαστε Ουσιαστικά λοιπόν γίνεται όποτε συναντήσουμε κάποιο σύμβολο HY340, 2012 Α. Σαββίδης Slide 7 / 22 HY340, 2012 Α. Σαββίδης Slide 8 / 22

Λειτουργίες Symbol Table Hide (4/5) Λειτουργίες Symbol Table Παράδειγμα (5/5) Απενεργοποίηση των μεταβλητών κάποιου επιπέδου εμβέλειας (συνήθως του τρέχοντος) Πότε γίνεται; Κατά την έξοδο από κάποιο block Κατά την έξοδο από συνάρτηση x = input(); g = 12.4; print(typeof(x)); function foo(x, y) { print(x + y); local p = y; ::print(p); function h(a) { return a + x + y; y = h(::x); lookup(x), ins(x), lookup(input) lookup(g), ins(g) lookup(print), lookup(typeof), lookup(x) lookup(foo), ins(foo), lookup(x), ins(x), lookup(y), ins(y) lookup(print), lookup(x), lookup(y) lookup(p), ins(p), lookup(y) lookup(::print), lookup(p) lookup(h), ins(h), lookup(a), ins(a) lookup(a), lookup(x), error hide(a) lookup(y), lookup(h), lookup(::x) hide(foo::x, foo::y, foo::p, foo::h) HY340, 2012 Α. Σαββίδης Slide 9 / 22 HY340, 2012 Α. Σαββίδης Slide 10 / 22 Symbol Definitions (1/2) Symbol Definitions Παράδειγμα (2/2) Symbol redefinition: Όταν υπάρχει ήδη μια μεταβλητή με id ίδιο με το id της μεταβλητής που πάμε να ορίσουμε και βρίσκεται στο ίδιο scope Μεταβλητές ίδιου scope με ίδιο όνομα (ok) Συναρτήσεις ίδιου scope με ίδιο όνομα (error) Συνάρτηση και μεταβλητή ίδιου scope με ίδιο όνομα (error) Οποιοδήποτε σύμβολο με όνομα ίδιο με συνάρτηση βιβλιοθήκης (error) Undefined symbol: Όταν μια μεταβλητή που χρησιμοποιείται δεν είναι στον πίνακα συμβόλων Οι μεταβλητές ορίζονται με την πρώτη εμφάνισή τους (εισάγονται στον symbol table) (ok) Όταν ζητάμε global μεταβλητή η οποία δεν έχει οριστεί και άρα δεν υπάρχει στον symbol table (error) read(a); a = input(); function foo(x) { local print = hello ; print(x + y); local hello = a; local hello = 35; function hello() { print(::a + ::x); function cos(){ function foo(){ New variables: read, a Function definition: foo, New variable: x Collision with library function: print (error) New variable: y New variable: hello Same variable hello Redeclaration of hello as function (error) Global a found but global x not found (error) Collision with library function: cos (error) Redeclaration of function: foo (error) HY340, 2012 Α. Σαββίδης Slide 11 / 22 HY340, 2012 Α. Σαββίδης Slide 12 / 22

Υλοποίηση του Symbol Table Υπάρχουν κυρίως δύο τρόποι υλοποίησης του πίνακα συμβόλων: Με Linked List Με Hash Table Προτιμάμε την υλοποίηση με Hashtable κυρίως λόγω της επίδοσης του Lookup Υλοποίηση Symbol Table με Hash Τable (1/2) Ένας Hashtable αποτελείται από buckets Κάθε σύμβολο κατανέμεται σε ένα από αυτά τα buckets με βάση μια hash συνάρτηση Σύμβολα που τυχαίνει να πέσουν στο ίδιο bucket δημιουργούν μια linked list Επιπλέον είναι χρήσιμο να υπάρχει και ένα scope link που δημιουργεί μία λίστα συνδέοντας όλα τα σύμβολα που ανήκουν στο ίδιο scope Αυτή η λίστα μπορεί να είναι μία δομή πάνω στην ήδη υπάρχουσα ή και ξεχωριστή (απλά πρέπει να ανανεώνεται παράλληλα με την κύρια δομή) HY340, 2012 Α. Σαββίδης Slide 13 / 22 HY340, 2012 Α. Σαββίδης Slide 14 / 22 Υλοποίηση Symbol Table με Hash Τable (2/2) Υλοποίηση λειτουργιών Symbol Table BUCKETS 0 0 1 1 2 2 0 0 2 3 SCOPE LISTS 2 COLLISION LISTS Οι συναρτήσεις Insert και Lookup είναι όμοιες με αυτές που έχετε υλοποιήσει σε προηγούμενα μαθήματα για Hashtables Πρέπει όμως να γίνει και ο χειρισμός του scope link Επιπλέον, είναι πιθανό θα χρειαστείτε δύο εκδόσεις για τη lookup Αναζήτηση ενός συμβόλου σε οποιοδήποτε scope Αναζήτηση ενός συμβόλου σε συγκεκριμένο scope Η συνάρτηση Hide θα «ακολουθεί» το scope link για μία συγκεκριμένη εμβέλεια και θα ακυρώνει αυτά τα σύμβολα HY340, 2012 Α. Σαββίδης Slide 15 / 22 HY340, 2012 Α. Σαββίδης Slide 16 / 22

Symbol Table Entries Χώροι Εμβέλειας typedef struct Variable { const char *name; unsigned int scope; unsigned int line; Variable; typedef struct Function { const char *name; //List of arguments unsigned int scope; unsigned int line; Function; enum SymbolTableType { GLOBAL, LOCAL, FORMAL, USERFUNC, LIBFUNC ; typedef struct SymbolTableEntry { bool isactive; union { Variable *varval; Function *funcval; value; enum SymbolType type; SymbolTableEntry; Ένας τρόπος χειρισμού των χώρων εμβέλειας (scopes) είναι να υπάρχει μία καθολική μεταβλητή που να δείχνει την εμβέλεια στην οποία βρισκόμαστε. Η μεταβλητή αυτή θα πρέπει να αυξάνεται ή να μειώνεται στα actions των κατάλληλων γραμματικών κανόνων Π.χ. block : { {++scope; stmts { Hide(scope--); Function definitions Όχι όμως στα indexed elements ενός πίνακα HY340, 2012 Α. Σαββίδης Slide 17 / 22 HY340, 2012 Α. Σαββίδης Slide 18 / 22 Χώροι Εμβέλειας Μεταβλητές (1/2) Χώροι Εμβέλειας Μεταβλητές (2/2) local x Κάνουμε lookup στο SymbolTable στο τρέχον scope Αν βρεθεί κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί Αν δε βρεθεί κάτι και δεν υπάρχει collision με library function προσθέτουμε στο SymbolTable νέα μεταβλητή στο τρέχον scope Αν είμαστε σε scope 0, η μεταβλητή δηλώνεται global (αγνοείται το local) ::x (global x) Κάνουμε lookup στο SymbolTable στο global scope Αν βρεθεί κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί, αλλιώς είναι error Το ::x δεν κάνει ποτέ εισαγωγή στο SymbolTable function f() { local f; //ok, found locally local print; //ok, found in scope 0 local x; //new global var in scope 0 { local f; //new local var in scope 1 local print; //error: trying to //shadow libfunc function g(a, b) { local a = local b; //ok, a and b found locally x; //new global var x print(::x); //ok, x found print(::y); //error: no y function f() { return ::x //ok { print(::f()); //ok, f found x (variable x) Κάνουμε lookup στο SymbolTable ξεκινώντας από το τρέχον scope και πηγαίνωντας μέχρι το global Η αναζήτηση γίνεται από μέσα προς τα έξω Αν δε βρεθεί τίποτα σε κανένα scope, τότε προσθέτουμε στο SymbolTable νέα μεταβλητή στο τρέχον scope Αν βρεθεί σε κάποιο scope κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί και μένει να δούμε αν έχουμε πρόσβαση στο σύμβολο Προσβασιμότητα συμβόλων Όλα τα ορατά σύμβολα που ορίζονται είτε μέσα στο τρέχον scope είτε σε κάποιο εξωτερικότερο scope χωρίς όμως να μεσολαβεί συνάρτηση είναι προσβάσιμα Π.χ. αν βρισκόμαστε σε συνάρτηση και αναφερόμαστε σε τοπική μεταβλητή ή τυπικό όρισμα κάποιας περιέχουσας συνάρτησης δεν έχουμε πρόσβαση Όλες οι ορατές συναρτήσεις, τόσο στο τρέχον scope όσο και σε εξωτερικότερα είναι ορατές (άσχετα με το αν μεσολαβεί συνάρτηση ή όχι) Όλες οι καθολικές μεταβλητές (σε scope 0) και οι συναρτήσεις βιβλιοθήκης είναι προσβάσιμες x = y = 1; //new variables x, y { x = 2; //ok, refers to global x a = 3; //new var a in scope 1 function f (z) { x = 4; //ok, refers to global x a = 5; //error: cannot access //a in scope 1 y = 6; //ok, refers to global y { z = 7; //ok, refers to formal function g() { return z; //error: cannot access z HY340, 2012 Α. Σαββίδης Slide 19 / 22 HY340, 2012 Α. Σαββίδης Slide 20 / 22

Χώροι Εμβέλειας Συναρτήσεις (1/2) funcdef function f( ) { Αν η συνάρτηση δεν έχει όνομα της δίνουμε εμείς ένα μοναδικό όνομα που δε μπορεί να δοθεί από το χρήστη (π.χ. _f1, $f2, κλπ) Κατά τα άλλα μπαίνει κανονικά στο SymbolTable Κάνουμε lookup στο τρέχον scope Αν βρεθεί μεταβλητή ή συνάρτηση είναι error Αν υπάρχει collision με libfunc είναι error Αλλιώς εισάγουμε νέα συνάρτηση στο τρέχον scope Μόνο αυτός ο κανόνας δηλώνει συναρτήσεις Προσοχή: αν έχουμε x(1); το x δεν είναι συνάρτηση αλλά μεταβλητή! formal arguments function f(x) { Κάνουμε lookup στο τρέχον scope (αυτό της συνάρτησης που δηλώνεται) Αν βρεθεί κάτι είναι error Αν υπάρχει collision με libfunc είναι error Αλλιώς εισάγουμε νέο τυπικό όρισμα στο τρέχον scope function f() { // f in scope 0 function f() {// f in scope 1 function f() {//error: f exists x = 1; function x() { //error: x is var function sin() { //error: func //shadows libfunc y(1, 2); //new variable y, not //function y function f(x, y, z) { //ok, f with formals x, y, z function g(x, y, x) { //error: //formal redeclaration function h(x, cos) { //error: //formal shadows libfunc Χώροι Εμβέλειας Συναρτήσεις (2/2) Οι συναρτήσεις (είτε χρήστη είτε βιβλιοθήκης) είναι σταθερές και δε μπορούν να αλλάξουν τιμή Συνεπώς, για μια συνάρτηση f απαγορεύονται ενέργειες όπως f = 1, ++f, f-- Στον κανόνα του lvalue όμως (lvalue id) που κάνουμε το lookup και βρίσκουμε π.χ. ότι αναφερόμαστε σε συνάρτηση δεν ξέρουμε ακόμα τον τρόπο χρήσης Μπορεί να είναι το λάθος f = 1 Αλλά και το σωστό f(1) Ο έλεγχος γίνεται στους επιμέρους κανόνες και όχι στο lvalue Στον κανόνα lvalue id απλά αποθηκεύουμε την πληροφορία του συμβόλου που βρήκαμε στο $$ Χρειάζεται να προσθέσουμε στο union του yacc τον κατάλληλο τύπο Αργότερα, στη χρήση του lvalue χρησιμοποιούμε το αποθηκευμένο σύμβολο για να ελέγξουμε τον τρόπο χρήσης Π.χ. στο assignexpr lvalue = expr αν το σύμβολο που περιέχεται στο $1 είναι συνάρτηση βγάζουμε το κατάλληλο μήνυμα λάθους HY340, 2012 Α. Σαββίδης Slide 21 / 22 HY340, 2012 Α. Σαββίδης Slide 22 / 22