HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Από τη C στη C++ Hy240b project 2014 Phase 1.
Advertisements

Τεχνολογίες Web Απαραίτητες γνώσεις για την υλοποίηση της άσκησης.
Η Γλώσσα Προγραμματισμού LOGO
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 2ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 26 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 11.
Στατική Συμβολική Παραγώγιση Λάμδα Εκφράσεων στην C++
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 1ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 5 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 11.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
Πολυδιάστατοι Πίνακες, Δομές, Ενώσεις
Πινακες (Arrays) Σημασια Συνταξη Αρχικοποιηση Προσβαση Παραμετροι
ΣΤΟΙΧΕΙΑ ΨΕΥΔΟΚΩΔΙΚΑ ΒΑΣΙΚΕΣ ΔΟΜΕΣ ΒΑΣΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ ΠΙΝΑΚΩΝ
Προγραμματισμός Ι Πίνακες •Ο πίνακας είναι μία συλλογή μεταβλητών ίδιου τύπου, οι οποίες είναι αποθηκευμένες σε διαδοχικές θέσεις μνήμης. Χρησιμοποιείται.
ΜΑΘ 3122 (106) Γλώσσα προγραμματισμού
Μάθημα : Βασικά Στοιχεία της Γλώσσας Java
Εισαγωγή στον Προγραμματισμό, Αντώνιος Συμβώνης, ΣΕΜΦΕ, ΕΜΠ, Slide 1 Εβδομάδα 3: Υλοποίηση μεθόδων.
TEMPLATES STANDARD TEMPLATE LIBRARY ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ C Evangelos Theodoridis.
 2003 Prentice Hall, Inc. All rights reserved. 1 Συναρτήσεις στη C++ ΠΕΡΙΕΧΟΜΕΝΑ Εισαγωγή Συστατικά προγράμματος στη C++ Μαθηματικές Συναρτήσεις ( Math.
HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φροντιστήρια Εισηγητής: Σπύρος Αργυρόπουλος Μέλος ΕΤΕΠ Εργαστήριο Προγραμματισμού & Τεχνολογίας Ευφυών Συστημάτων.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων, Σημασιολογικές Ενέργειες.
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής Αντώνιος Συμβώνης, ΕΜΠ, Slide 1 Week 4: Exceptions Εβδομάδα 4: Εξαιρέσεις [Exceptions]
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Δομημένος Προγραμματισμός και Δομές.
Linear Hashing Τμήμα Πληροφορικής & Τηλ/νών, ΕΚΠΑ Υλοποίηση Συστημάτων Βάσεων Δεδομένων
Κεφάλαιο 2ο Πεπερασμένα αυτόματα.
1 ΕΝΤΟΛΕΣ ΠΛΗΡΟΦΟΡΙΩΝ ΓΕΝΙΚΕΣ ΠΛΗΡΟΦΟΡΙΕΣΓΕΝΙΚΕΣ ΠΛΗΡΟΦΟΡΙΕΣ ΘΕΣΗ ΣΗΜΕΙΟΥΘΕΣΗ ΣΗΜΕΙΟΥ ΑΠΟΣΤΑΣΗΑΠΟΣΤΑΣΗ ΕΜΒΑΔΟΝΕΜΒΑΔΟΝ.
Κοντινότεροι Κοινοί Πρόγονοι α βγ θ δεζ η π ν ι κλμ ρσ τ κκπ(λ,ι)=α, κκπ(τ,σ)=ν, κκπ(λ,π)=η κκπ(π,σ)=γ, κκπ(ξ,ο)=κ ξο κκπ(ι,ξ)=β, κκπ(τ,θ)=θ, κκπ(ο,μ)=α.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων. Πίνακας Συμβόλων (Symbol Table) (Ι)  Είναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματος και.
Lab 10: Hash Tables with Chaining 20/11/2009Panayiotis Charalambous.
ΜΕΤΑΒΛΗΤΕΣ - ΤΥΠΟΙ ΜΑΘΗΜΑ 3.
Εισαγωγή Ειδικά Θέματα Μεταγγλωτιστών Χειμερινό Εξάμηνο / Κατασκευή compiler για την γλώσσα Minijava.
Ολυμπιάδα Πληροφορικής
ΣΥΝΑΡΤΗΣΕΙΣ.
Πάνω προς Κάτω Σχεδιασμός και Συναρτήσεις
Τεχνολογία ΛογισμικούSlide 1 Αλγεβρική Εξειδίκευση u Καθορισμός τύπων αφαίρεσης σε όρους σχέσεων μεταξύ τύπων λειτουργιών.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων Φροντιστήριο - 30/04/2009.
Lists– Λίστες 1. Αυτό-αναφορικές δομές Τα μέλη μίας δομής μπορεί να είναι οποιουδήποτε τύπου, ακόμα και δείκτες σε δομές του ίδιου τύπου. Χρησιμοποιώντας.
Ενότητα Α.4. Δομημένος Προγραμματισμός
ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ 2η Εργασία Μαθήματος Γιώργος Γιαγλής Οικονομικό Πανεπιστήμιο Αθηνών Τμήμα Διοικητικής Επιστήμης & Τεχνολογίας.
Δομές Δεδομένων. Επιλογή δομής δεδομένων Κριτήρια: – Μέγεθος του προβλήματος – Πως θα χρησιμοποιηθεί Ενέργειες που καθορίζουν το κόστος: – Lookup: αναζήτηση/έλεγχος.
ΕΠΛ 223 Θεωρία και Πρακτική Μεταγλωττιστών7-1 Πίνακας Συμβόλων Πίνακας συμβόλων: δομή δεδομένων που χρησιμοποιείται για την αποθήκευση διαφόρων πληροφοριών.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
1 ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Πίνακας Συμβόλων Symbol Table.
Βάσεις Δεδομένων Εργαστήριο ΙΙ Τμήμα Πληροφορικής ΑΠΘ
HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.
Δομές Αναζήτησης TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες:
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
Lab 3: Sorted List ΕΠΛ231-Δομές Δεδομένων και Αλγόριθμοι115/4/2015.
Δρ. Μαρία Ι. Ανδρέου Εισαγωγή στον Αντικειμενόστρεφη Προγραμματισμό (Object-Oriented Programming) Data Types, Variables, and Arithmetic.
ΜΑΘ3122/106 – Γλώσσα προγραμματισμούΞενοφών Ζαμπούλης ΜΑΘ3122/106 Γλώσσα προγραμματισμού Συναρτήσεις.
Έλεγχος Ονομάτων (Name Control) Για ένα πρόγραμμα που αποτελείται από πολλά τμήματα κάποια από τα οποία έχουν πιθανώς γραφτεί από άλλους προγραμματιστές.
Υπερφόρτωση Τελεστών (Συνέχεια) Αντικειμενοστραφής Προγραμματισμός.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Syntax Directed Translation and alpha Language.
Βασικά στοιχεία της Java
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Πίνακας Συμβόλων Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
Δομές.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος
Πίνακας Συμβόλων Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής.
Εισαγωγή στον Προγ/μό Υπολογιστών
Δυναμικός Κατακερματισμός
Μεταγράφημα παρουσίασης:

HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης

HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ Φροντιστήριο 3 ο Symbol Table & Scopes HY340, 2012 Α. Σαββίδης Slide 2 / 22

Τι είναι ο Symbol Table Ο πίνακας συμβόλων (symbol table) είναι μία δομή, όπου αποθηκεύεται πληροφορία σχετικά με τα σύμβολα του προγράμματος Ο πίνακας συμβόλων (symbol table) είναι μία δομή, όπου αποθηκεύεται πληροφορία σχετικά με τα σύμβολα του προγράμματος Είδος συμβόλου (μεταβλητή ή συνάρτηση) Είδος συμβόλου (μεταβλητή ή συνάρτηση) Scope (εμβέλεια) του συμβόλου Scope (εμβέλεια) του συμβόλου Ο πίνακας συμβόλων προσπελαύνεται κάθε φορά που ο compiler συναντά κάποιο σύμβολο Ο πίνακας συμβόλων προσπελαύνεται κάθε φορά που ο compiler συναντά κάποιο σύμβολο Ορισμός νέων συμβόλων Ορισμός νέων συμβόλων Εύρεση υπαρχόντων συμβόλων Εύρεση υπαρχόντων συμβόλων HY340, 2012 Α. Σαββίδης Slide 3 / 22

Δεδομένα Symbol Table (1/2) Μεταβλητές Μεταβλητές Όνομα Όνομα Τύπος Τύπος  Καθολική μεταβλητή, τυπικό όρισμα ή τοπική μεταβλητή Εμβέλεια (scope) Εμβέλεια (scope) Γραμμή δήλωσης Γραμμή δήλωσης Συναρτήσεις Συναρτήσεις Όνομα Όνομα Τύπος Τύπος  Συνάρτηση προγραμματιστή, ή βιβλιοθήκης Τυπικά ορίσματα Τυπικά ορίσματα Εμβέλεια (scope) Εμβέλεια (scope) Γραμμή δήλωσης Γραμμή δήλωσης HY340, 2012 Α. Σαββίδης Slide 4 / 22

Δεδομένα Symbol Table – Παράδειγμα (2/2) 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 x: global variable at scope 0, line 1 input: library function at scope 0, line 0 input: library function at scope 0, line 0 g: user defined function with arguments x, y, at scope 0, line 2 g: user defined function with arguments x, y, at scope 0, line 2 x, y: formal arguments at scope 1, line 2 x, y: formal arguments at scope 1, line 2 z: local variable at scope 1, line 3 z: local variable at scope 1, line 3 print: library function at scope 0, line 0 print: library function at scope 0, line 0 f: user defined function with arguments a, b, at scope 1, line 5 f: user defined function with arguments a, b, at scope 1, line 5 a, b: formal arguments at scope 2, line 5 a, b: formal arguments at scope 2, line 5 HY340, 2012 Α. Σαββίδης Slide 5 / 22

Λειτουργίες Symbol Table (1/5) Insert Insert Εισαγωγή ενός νέου συμβόλου στον πίνακα Εισαγωγή ενός νέου συμβόλου στον πίνακα Lookup Lookup Αναζήτηση ενός συμβόλου στον πίνακα Αναζήτηση ενός συμβόλου στον πίνακα Hide Hide Απενεργοποίηση (όχι διαγραφή) όλων των συμβόλων ενός επιπέδου εμβέλειας Απενεργοποίηση (όχι διαγραφή) όλων των συμβόλων ενός επιπέδου εμβέλειας HY340, 2012 Α. Σαββίδης Slide 6 / 22

Λειτουργίες Symbol Table – Insert (2/5) Όποτε αναγνωρίζεται ένα σύμβολο δημιουργείται μία νέα εγγραφή για αυτό, εφόσον δεν υπάρχει ήδη στον symbol table Όποτε αναγνωρίζεται ένα σύμβολο δημιουργείται μία νέα εγγραφή για αυτό, εφόσον δεν υπάρχει ήδη στον symbol table Πότε γίνεται; Πότε γίνεται; Κατά τον ορισμό νέας μεταβλητής, π.χ. local x; Κατά τον ορισμό νέας μεταβλητής, π.χ. local x;  Εκτός φυσικά αν αναφέρεται σε μεταβλητή ή συνάρτηση στο ίδιο scope Κατά τον ορισμό νέας συνάρτησης, π.χ. function foo(x, y) { return x+y;} Κατά τον ορισμό νέας συνάρτησης, π.χ. function foo(x, y) { return x+y;} Κατά την χρήση μη ορισμένου συμβόλου, πχ. x = input(); Κατά την χρήση μη ορισμένου συμβόλου, πχ. x = input(); HY340, 2012 Α. Σαββίδης Slide 7 / 22

Λειτουργίες Symbol Table – Lookup (3/5) Αναζήτηση ενός συμβόλου στο τρέχον επίπεδο εμβέλειας ή σε περιέχουσα εμβέλεια με βάση τους κανόνες που ακολουθεί η γλώσσα Αναζήτηση ενός συμβόλου στο τρέχον επίπεδο εμβέλειας ή σε περιέχουσα εμβέλεια με βάση τους κανόνες που ακολουθεί η γλώσσα Πότε γίνεται; Πότε γίνεται; Κατά τον ορισμό ενός συμβόλου Κατά τον ορισμό ενός συμβόλου  Για να ελέγξουμε ότι δεν υπάρχει σύγκρουση με κάποιο ήδη υπάρχον σύμβολο Κατά την χρήση ενός συμβόλου Κατά την χρήση ενός συμβόλου  Για να βρούμε το σύμβολο στο οποίο αναφερόμαστε Ουσιαστικά λοιπόν γίνεται όποτε συναντήσουμε κάποιο σύμβολο Ουσιαστικά λοιπόν γίνεται όποτε συναντήσουμε κάποιο σύμβολο HY340, 2012 Α. Σαββίδης Slide 8 / 22

Λειτουργίες Symbol Table – Hide (4/5) Απενεργοποίηση των μεταβλητών κάποιου επιπέδου εμβέλειας (συνήθως του τρέχοντος) Απενεργοποίηση των μεταβλητών κάποιου επιπέδου εμβέλειας (συνήθως του τρέχοντος) Πότε γίνεται; Πότε γίνεται; Κατά την έξοδο από κάποιο block Κατά την έξοδο από κάποιο block Κατά την έξοδο από συνάρτηση Κατά την έξοδο από συνάρτηση HY340, 2012 Α. Σαββίδης Slide 9 / 22

Λειτουργίες Symbol Table – Παράδειγμα (5/5) 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 10 / 22

Symbol Definitions (1/2) Symbol redefinition: Symbol redefinition: Όταν υπάρχει ήδη μια μεταβλητή με id ίδιο με το id της μεταβλητής που πάμε να ορίσουμε και βρίσκεται στο ίδιο scope Όταν υπάρχει ήδη μια μεταβλητή με id ίδιο με το id της μεταβλητής που πάμε να ορίσουμε και βρίσκεται στο ίδιο scope  Μεταβλητές ίδιου scope με ίδιο όνομα (ok)  Συναρτήσεις ίδιου scope με ίδιο όνομα (error)  Συνάρτηση και μεταβλητή ίδιου scope με ίδιο όνομα (error)  Οποιοδήποτε σύμβολο με όνομα ίδιο με συνάρτηση βιβλιοθήκης (error) Undefined symbol: Undefined symbol: Όταν μια μεταβλητή που χρησιμοποιείται δεν είναι στον πίνακα συμβόλων Όταν μια μεταβλητή που χρησιμοποιείται δεν είναι στον πίνακα συμβόλων  Οι μεταβλητές ορίζονται με την πρώτη εμφάνισή τους (εισάγονται στον symbol table) (ok)  Όταν ζητάμε global μεταβλητή η οποία δεν έχει οριστεί και άρα δεν υπάρχει στον symbol table (error) HY340, 2012 Α. Σαββίδης Slide 11 / 22

Symbol Definitions – Παράδειγμα (2/2) 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 12 / 22

Υλοποίηση του Symbol Table Υπάρχουν κυρίως δύο τρόποι υλοποίησης του πίνακα συμβόλων: Υπάρχουν κυρίως δύο τρόποι υλοποίησης του πίνακα συμβόλων: Με Linked List Με Linked List Με Hash Table Με Hash Table Προτιμάμε την υλοποίηση με Hashtable κυρίως λόγω της επίδοσης του Lookup Προτιμάμε την υλοποίηση με Hashtable κυρίως λόγω της επίδοσης του Lookup HY340, 2012 Α. Σαββίδης Slide 13 / 22

Υλοποίηση Symbol Table με Hash Τable (1/2) Ένας Hashtable αποτελείται από buckets Ένας Hashtable αποτελείται από buckets Κάθε σύμβολο κατανέμεται σε ένα από αυτά τα buckets με βάση μια hash συνάρτηση Κάθε σύμβολο κατανέμεται σε ένα από αυτά τα buckets με βάση μια hash συνάρτηση Σύμβολα που τυχαίνει να πέσουν στο ίδιο bucket δημιουργούν μια linked list Σύμβολα που τυχαίνει να πέσουν στο ίδιο bucket δημιουργούν μια linked list Επιπλέον είναι χρήσιμο να υπάρχει και ένα scope link που δημιουργεί μία λίστα συνδέοντας όλα τα σύμβολα που ανήκουν στο ίδιο scope Επιπλέον είναι χρήσιμο να υπάρχει και ένα scope link που δημιουργεί μία λίστα συνδέοντας όλα τα σύμβολα που ανήκουν στο ίδιο scope Αυτή η λίστα μπορεί να είναι μία δομή πάνω στην ήδη υπάρχουσα ή και ξεχωριστή (απλά πρέπει να ανανεώνεται παράλληλα με την κύρια δομή) Αυτή η λίστα μπορεί να είναι μία δομή πάνω στην ήδη υπάρχουσα ή και ξεχωριστή (απλά πρέπει να ανανεώνεται παράλληλα με την κύρια δομή) HY340, 2012 Α. Σαββίδης Slide 14 / 22

Υλοποίηση Symbol Table με Hash Τable (2/2) BUCKETS … … SCOPE LISTS COLLISION LISTS HY340, 2012 Α. Σαββίδης Slide 15 / 22

Υλοποίηση λειτουργιών Symbol Table Οι συναρτήσεις Insert και Lookup είναι όμοιες με αυτές που έχετε υλοποιήσει σε προηγούμενα μαθήματα για Hashtables Οι συναρτήσεις Insert και Lookup είναι όμοιες με αυτές που έχετε υλοποιήσει σε προηγούμενα μαθήματα για Hashtables Πρέπει όμως να γίνει και ο χειρισμός του scope link Πρέπει όμως να γίνει και ο χειρισμός του scope link Επιπλέον, είναι πιθανό θα χρειαστείτε δύο εκδόσεις για τη lookup Επιπλέον, είναι πιθανό θα χρειαστείτε δύο εκδόσεις για τη lookup  Αναζήτηση ενός συμβόλου σε οποιοδήποτε scope  Αναζήτηση ενός συμβόλου σε συγκεκριμένο scope Η συνάρτηση Hide θα «ακολουθεί» το scope link για μία συγκεκριμένη εμβέλεια και θα ακυρώνει αυτά τα σύμβολα Η συνάρτηση Hide θα «ακολουθεί» το scope link για μία συγκεκριμένη εμβέλεια και θα ακυρώνει αυτά τα σύμβολα 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; HY340, 2012 Α. Σαββίδης Slide 17 / 22

Χώροι Εμβέλειας Ένας τρόπος χειρισμού των χώρων εμβέλειας (scopes) είναι να υπάρχει μία καθολική μεταβλητή που να δείχνει την εμβέλεια στην οποία βρισκόμαστε. Ένας τρόπος χειρισμού των χώρων εμβέλειας (scopes) είναι να υπάρχει μία καθολική μεταβλητή που να δείχνει την εμβέλεια στην οποία βρισκόμαστε. Η μεταβλητή αυτή θα πρέπει να αυξάνεται ή να μειώνεται στα actions των κατάλληλων γραμματικών κανόνων Η μεταβλητή αυτή θα πρέπει να αυξάνεται ή να μειώνεται στα actions των κατάλληλων γραμματικών κανόνων Π.χ. block : ‘{’ {++scope;} stmts ‘}’ { Hide(scope--); } Π.χ. block : ‘{’ {++scope;} stmts ‘}’ { Hide(scope--); } Function definitions Function definitions Όχι όμως στα indexed elements ενός πίνακα Όχι όμως στα indexed elements ενός πίνακα HY340, 2012 Α. Σαββίδης Slide 18 / 22

Χώροι Εμβέλειας – Μεταβλητές (1/2) local x local x Κάνουμε lookup στο SymbolTable στο τρέχον scope Κάνουμε lookup στο SymbolTable στο τρέχον scope Αν βρεθεί κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί Αν βρεθεί κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί Αν δε βρεθεί κάτι και δεν υπάρχει collision με library function προσθέτουμε στο SymbolTable νέα μεταβλητή στο τρέχον scope Αν δε βρεθεί κάτι και δεν υπάρχει collision με library function προσθέτουμε στο SymbolTable νέα μεταβλητή στο τρέχον scope  Αν είμαστε σε scope 0, η μεταβλητή δηλώνεται global (αγνοείται το local) HY340, 2012 Α. Σαββίδης 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 f; //new local var in scope 1 local print; //error: trying to local print; //error: trying to //shadow libfunc //shadow libfunc} function g(a, b) { local a = local b; } //ok, a and b found locally ::x (global x) ::x (global x) Κάνουμε lookup στο SymbolTable στο global scope Κάνουμε lookup στο SymbolTable στο global scope Αν βρεθεί κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί, αλλιώς είναι error Αν βρεθεί κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί, αλλιώς είναι error Το ::x δεν κάνει ποτέ εισαγωγή στο SymbolTable Το ::x δεν κάνει ποτέ εισαγωγή στο SymbolTable 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 Slide 19 / 22

Χώροι Εμβέλειας – Μεταβλητές (2/2) x (variable x) x (variable x) Κάνουμε lookup στο SymbolTable ξεκινώντας από το τρέχον scope και πηγαίνωντας μέχρι το global Κάνουμε lookup στο SymbolTable ξεκινώντας από το τρέχον scope και πηγαίνωντας μέχρι το global  Η αναζήτηση γίνεται από μέσα προς τα έξω Αν δε βρεθεί τίποτα σε κανένα scope, τότε προσθέτουμε στο SymbolTable νέα μεταβλητή στο τρέχον scope Αν δε βρεθεί τίποτα σε κανένα scope, τότε προσθέτουμε στο SymbolTable νέα μεταβλητή στο τρέχον scope Αν βρεθεί σε κάποιο scope κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί και μένει να δούμε αν έχουμε πρόσβαση στο σύμβολο Αν βρεθεί σε κάποιο scope κάτι (είτε μεταβλητή είτε συνάρτηση) αναφερόμαστε εκεί και μένει να δούμε αν έχουμε πρόσβαση στο σύμβολο Προσβασιμότητα συμβόλων Προσβασιμότητα συμβόλων Όλα τα ορατά σύμβολα που ορίζονται είτε μέσα στο τρέχον scope είτε σε κάποιο εξωτερικότερο scope χωρίς όμως να μεσολαβεί συνάρτηση είναι προσβάσιμα Όλα τα ορατά σύμβολα που ορίζονται είτε μέσα στο τρέχον scope είτε σε κάποιο εξωτερικότερο scope χωρίς όμως να μεσολαβεί συνάρτηση είναι προσβάσιμα  Π.χ. αν βρισκόμαστε σε συνάρτηση και αναφερόμαστε σε τοπική μεταβλητή ή τυπικό όρισμα κάποιας περιέχουσας συνάρτησης δεν έχουμε πρόσβαση Όλες οι ορατές συναρτήσεις, τόσο στο τρέχον scope όσο και σε εξωτερικότερα είναι ορατές (άσχετα με το αν μεσολαβεί συνάρτηση ή όχι) Όλες οι ορατές συναρτήσεις, τόσο στο τρέχον scope όσο και σε εξωτερικότερα είναι ορατές (άσχετα με το αν μεσολαβεί συνάρτηση ή όχι) Όλες οι καθολικές μεταβλητές (σε scope 0) και οι συναρτήσεις βιβλιοθήκης είναι προσβάσιμες Όλες οι καθολικές μεταβλητές (σε scope 0) και οι συναρτήσεις βιβλιοθήκης είναι προσβάσιμες HY340, 2012 Α. Σαββίδης x = y = 1; //new variables x, y { x = 2; //ok, refers to global x x = 2; //ok, refers to global x a = 3; //new var a in scope 1 a = 3; //new var a in scope 1 function f (z) { function f (z) { x = 4; //ok, refers to global x x = 4; //ok, refers to global x a = 5; //error: cannot access a = 5; //error: cannot access //a in scope 1 //a in scope 1 y = 6; //ok, refers to global y y = 6; //ok, refers to global y { z = 7; //ok, refers to formal z = 7; //ok, refers to formal function g() { return z; } function g() { return z; } //error: cannot access z //error: cannot access z } }} Slide 20 / 22

Χώροι Εμβέλειας – Συναρτήσεις (1/2) funcdef – function f(…) {} funcdef – function f(…) {} Αν η συνάρτηση δεν έχει όνομα της δίνουμε εμείς ένα μοναδικό όνομα που δε μπορεί να δοθεί από το χρήστη (π.χ. _f1, $f2, κλπ) Αν η συνάρτηση δεν έχει όνομα της δίνουμε εμείς ένα μοναδικό όνομα που δε μπορεί να δοθεί από το χρήστη (π.χ. _f1, $f2, κλπ)  Κατά τα άλλα μπαίνει κανονικά στο SymbolTable Κάνουμε lookup στο τρέχον scope Κάνουμε lookup στο τρέχον scope Αν βρεθεί μεταβλητή ή συνάρτηση είναι error Αν βρεθεί μεταβλητή ή συνάρτηση είναι error Αν υπάρχει collision με libfunc είναι error Αν υπάρχει collision με libfunc είναι error Αλλιώς εισάγουμε νέα συνάρτηση στο τρέχον scope Αλλιώς εισάγουμε νέα συνάρτηση στο τρέχον scope Μόνο αυτός ο κανόνας δηλώνει συναρτήσεις Μόνο αυτός ο κανόνας δηλώνει συναρτήσεις  Προσοχή: αν έχουμε x(1); το x δεν είναι συνάρτηση αλλά μεταβλητή! HY340, 2012 Α. Σαββίδης function f() { // f in scope 0 function f() {}// f in scope 1 function f() {}// f in scope 1 function f() {}//error: f exists 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 y formal arguments – function f(x) {} formal arguments – function f(x) {} Κάνουμε lookup στο τρέχον scope (αυτό της συνάρτησης που δηλώνεται) Κάνουμε lookup στο τρέχον scope (αυτό της συνάρτησης που δηλώνεται) Αν βρεθεί κάτι είναι error Αν βρεθεί κάτι είναι error Αν υπάρχει collision με libfunc είναι error Αν υπάρχει collision με libfunc είναι error Αλλιώς εισάγουμε νέο τυπικό όρισμα στο τρέχον scope Αλλιώς εισάγουμε νέο τυπικό όρισμα στο τρέχον scope 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 Slide 21 / 22

Χώροι Εμβέλειας – Συναρτήσεις (2/2) Οι συναρτήσεις (είτε χρήστη είτε βιβλιοθήκης) είναι σταθερές και δε μπορούν να αλλάξουν τιμή Οι συναρτήσεις (είτε χρήστη είτε βιβλιοθήκης) είναι σταθερές και δε μπορούν να αλλάξουν τιμή Συνεπώς, για μια συνάρτηση f απαγορεύονται ενέργειες όπως Συνεπώς, για μια συνάρτηση f απαγορεύονται ενέργειες όπως f = 1, ++f, f-- f = 1, ++f, f-- Στον κανόνα του lvalue όμως (lvalue  id) που κάνουμε το lookup και βρίσκουμε π.χ. ότι αναφερόμαστε σε συνάρτηση δεν ξέρουμε ακόμα τον τρόπο χρήσης Στον κανόνα του lvalue όμως (lvalue  id) που κάνουμε το lookup και βρίσκουμε π.χ. ότι αναφερόμαστε σε συνάρτηση δεν ξέρουμε ακόμα τον τρόπο χρήσης Μπορεί να είναι το λάθος f = 1 Μπορεί να είναι το λάθος f = 1 Αλλά και το σωστό f(1) Αλλά και το σωστό f(1) Ο έλεγχος γίνεται στους επιμέρους κανόνες και όχι στο lvalue Ο έλεγχος γίνεται στους επιμέρους κανόνες και όχι στο lvalue Στον κανόνα lvalue  id απλά αποθηκεύουμε την πληροφορία του συμβόλου που βρήκαμε στο $$ Στον κανόνα lvalue  id απλά αποθηκεύουμε την πληροφορία του συμβόλου που βρήκαμε στο $$  Χρειάζεται να προσθέσουμε στο union του yacc τον κατάλληλο τύπο %union { SymbolTableEntry* exprNode; … } %type lvalue%union { SymbolTableEntry* exprNode; … } %type lvalue Αργότερα, στη χρήση του lvalue χρησιμοποιούμε το αποθηκευμένο σύμβολο για να ελέγξουμε τον τρόπο χρήσης Αργότερα, στη χρήση του lvalue χρησιμοποιούμε το αποθηκευμένο σύμβολο για να ελέγξουμε τον τρόπο χρήσης  Π.χ. στο assignexpr  lvalue ‘=‘ expr αν το σύμβολο που περιέχεται στο $1 είναι συνάρτηση βγάζουμε το κατάλληλο μήνυμα λάθους HY340, 2012 Α. Σαββίδης Slide 22 / 22