Lecture 7: Type Systems and Symbol Tables. CS 540 George Mason University

Similar documents
Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

Semantic Analysis. Compiler Architecture

The Compiler So Far. Lexical analysis Detects inputs with illegal tokens. Overview of Semantic Analysis

Anatomy of a Compiler. Overview of Semantic Analysis. The Compiler So Far. Why a Separate Semantic Analysis?

CS1622. Semantic Analysis. The Compiler So Far. Lecture 15 Semantic Analysis. How to build symbol tables How to use them to find

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler so far

The role of semantic analysis in a compiler

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler Front-End

Type Bindings. Static Type Binding

Chapter 5 Names, Binding, Type Checking and Scopes

Chapter 5. Names, Bindings, and Scopes

Semantic Analysis and Type Checking

Type Checking. Error Checking

The Compiler So Far. CSC 4181 Compiler Construction. Semantic Analysis. Beyond Syntax. Goals of a Semantic Analyzer.

Static Semantics. Winter /3/ Hal Perkins & UW CSE I-1

Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 17: Types and Type-Checking 25 Feb 08

Answer: Early binding generally leads to greater efficiency (compilation approach) Late binding general leads to greater flexibility

CS558 Programming Languages

Computer Science Department Carlos III University of Madrid Leganés (Spain) David Griol Barres

SE352b: Roadmap. SE352b Software Engineering Design Tools. W3: Programming Paradigms

Syntax Errors; Static Semantics

Static Checking and Type Systems

Lecture 16: Static Semantics Overview 1

Overview of Semantic Analysis. Lecture 9

SEMANTIC ANALYSIS TYPES AND DECLARATIONS

Static Semantics. Lecture 15. (Notes by P. N. Hilfinger and R. Bodik) 2/29/08 Prof. Hilfinger, CS164 Lecture 15 1

Intermediate Code Generation Part II

Type systems. Static typing

Formal Languages and Compilers Lecture X Intermediate Code Generation

CS558 Programming Languages

Compilers. Type checking. Yannis Smaragdakis, U. Athens (original slides by Sam

Lecture 9: Procedures & Functions. CS 540 George Mason University

CMSC 330: Organization of Programming Languages

CS558 Programming Languages

Intermediate Code Generation

CSE 431S Type Checking. Washington University Spring 2013

CSE 504. Expression evaluation. Expression Evaluation, Runtime Environments. One possible semantics: Problem:

Topics Covered Thus Far. CMSC 330: Organization of Programming Languages. Language Features Covered Thus Far. Programming Languages Revisited

Semantic Analysis. How to Ensure Type-Safety. What Are Types? Static vs. Dynamic Typing. Type Checking. Last time: CS412/CS413

Types. What is a type?

9/7/17. Outline. Name, Scope and Binding. Names. Introduction. Names (continued) Names (continued) In Text: Chapter 5

Types. Type checking. Why Do We Need Type Systems? Types and Operations. What is a type? Consensus

CS558 Programming Languages

CA Compiler Construction

Chapter 5 Names, Bindings, Type Checking, and Scopes

NOTE: Answer ANY FOUR of the following 6 sections:

CS 330 Lecture 18. Symbol table. C scope rules. Declarations. Chapter 5 Louden Outline

Topics Covered Thus Far CMSC 330: Organization of Programming Languages

CS558 Programming Languages

The SPL Programming Language Reference Manual

Subprograms. Copyright 2015 Pearson. All rights reserved. 1-1

Names, Scopes, and Bindings. CSE 307 Principles of Programming Languages Stony Brook University

Pierce Ch. 3, 8, 11, 15. Type Systems

Properties of an identifier (and the object it represents) may be set at

Names, Scopes, and Bindings. CSE 307 Principles of Programming Languages Stony Brook University

Introduction to Programming Using Java (98-388)

CSC 533: Organization of Programming Languages. Spring 2005

COS 320. Compiling Techniques

Programming Languages, Summary CSC419; Odelia Schwartz

Concepts Introduced in Chapter 6

CPSC 3740 Programming Languages University of Lethbridge. Data Types

CSCE 314 Programming Languages. Type System

Formal Languages and Compilers Lecture IX Semantic Analysis: Type Chec. Type Checking & Symbol Table

Fundamentals of Programming Languages

Principles of Programming Languages Topic: Scope and Memory Professor Louis Steinberg Fall 2004

TYPES, VALUES AND DECLARATIONS

Structure of Programming Languages Lecture 10

Imperative Programming

Compiler Theory. (Semantic Analysis and Run-Time Environments)

Semantic Processing. Semantic Errors. Semantics - Part 1. Semantics - Part 1

Implementing Subprograms

Informal Semantics of Data. semantic specification names (identifiers) attributes binding declarations scope rules visibility

Semantic Analysis. Lecture 9. February 7, 2018

Names, Scopes, and Bindings II. Hwansoo Han

CSE P 501 Compilers. Static Semantics Hal Perkins Winter /22/ Hal Perkins & UW CSE I-1

Outline. Java Models for variables Types and type checking, type safety Interpretation vs. compilation. Reasoning about code. CSCI 2600 Spring

Programming Languages Third Edition. Chapter 7 Basic Semantics

R13 SET Discuss how producer-consumer problem and Dining philosopher s problem are solved using concurrency in ADA.

Binding and Variables

Type Inference Systems. Type Judgments. Deriving a Type Judgment. Deriving a Judgment. Hypothetical Type Judgments CS412/CS413

CS558 Programming Languages. Winter 2013 Lecture 3

Concepts Introduced in Chapter 6

5. Semantic Analysis. Mircea Lungu Oscar Nierstrasz

Compilers CS S-05 Semantic Analysis

Semantic actions for declarations and expressions

Type Systems. Today. 1. Organizational Matters. 1. Organizational Matters. Lecture 1 Oct. 20th, 2004 Sebastian Maneth. 1. Organizational Matters

1 Lexical Considerations

Semantic actions for declarations and expressions. Monday, September 28, 15

Types and Type Inference

11. a b c d e. 12. a b c d e. 13. a b c d e. 14. a b c d e. 15. a b c d e

Chapter 9 Subprograms

Overloading, Type Classes, and Algebraic Datatypes

CS558 Programming Languages

Expressions and Assignment

Lecture Outline. COOL operational semantics. Operational Semantics of Cool. Motivation. Lecture 13. Notation. The rules. Evaluation Rules So Far

A Short Summary of Javali

An Activation Record for Simple Subprograms. Activation Record for a Language with Stack-Dynamic Local Variables

CSE 307: Principles of Programming Languages

Project Compiler. CS031 TA Help Session November 28, 2011

Transcription:

Lecture 7: Type Systems and Symbol Tables CS 540 George Mason University

Static Analysis Compilers examine code to find semantic problems. Easy: undeclared variables, tag matching Difficult: preventing execution errors Essential Issues: Part I: Type checking Part II: Scope Part III: Symbol tables CS 540 Spring 2009 GMU 2

Part I: Type Checking

Type Systems A type is a set of values and associated operations. A type system is a collection of rules for assigning type expressions to various parts of the program. Impose constraints that help enforce correctness. Provide a high-level interface for commonly used constructs (for example, arrays, records). Make it possible to tailor computations to the type, increasing efficiency (for example, integer vs. real arithmetic). Different languages have different type systems. CS 540 Spring 2009 GMU 4

Inference Rules - Typechecking Static (compile time) and Dynamic (runtime). One responsibility of a compiler is to see that all symbols are used correctly (i.e. consistently with the type system) to prevent execution errors. Strong typing All expressions are guaranteed to be type consistent although the type itself is not always known (may require additional runtime checking). CS 540 Spring 2009 GMU 5

What are Execution Errors? Trapped errors errors that cause a computation to stop immediately Division by 0 Accessing illegal address Untrapped errors errors that can go unnoticed for a while and then cause arbitrary behavior Improperly using legal address (moving past end of array) Jumping to wrong address (jumping to data location) A program fragment is safe if it does not cause untrapped errors to occur. CS 540 Spring 2009 GMU 6

Typechecking We need to be able to assign types to all expressions in a program and show that they are all being used correctly. Input: x * y + f(a,b) E E + E * E x y E f(a,b) Are x, y and f declared? Can x and y be multiplied together? What is the return type of function f? Does f have the right number and type of parameters? Can f s return type be added to something? CS 540 Spring 2009 GMU 7

Program Symbols User defines symbols with associated meanings. Must keep information around about these symbols: Is the symbol declared? Is the symbol visible at this point? Is the symbol used correctly with respect to its declaration? CS 540 Spring 2009 GMU 8

Using Syntax Directed Translation to process symbols While parsing input program, need to: Process declarations for given symbols Scope what are the visible symbols in the current scope? Type what is the declared type of the symbol? Lookup symbols used in program to find current binding Determine the type of the expressions in the program CS 540 Spring 2009 GMU 9

Syntax Directed Type Checking Consider the following simple language P D S D id: T ; D T integer float array [ num ] of T ^T S S ; S id := E E int_literal float_literal id E + E E [ E ] E^ How can we typecheck strings in this language? CS 540 Spring 2009 GMU 10

Example of language: P i: integer; j: integer i := i + 1; j := i + 1 D ; S D ; D S ; S id : T id : T id := E id := E integer integer E + E E + E id num id num CS 540 Spring 2009 GMU 11

Processing Declarations D id : T ; D D T integer T float {insert(id.name,t.type);} {T.type = integer;} {T.type = float;} T array [ num ] of T 1 {T.type = array(t 1.type,num); } T ^T 1 {T.type = pointer(t 1.type);} Put info into the symbol table Accumulate information about the declared type CS 540 Spring 2009 GMU 12

Can use Trees (or DAGs) to Represent Types array 25 array array 10 pointer 100 pointer integer float array[25] of array[10] of ^(integer) array[100] of ^(float) Build data structures while we parse CS 540 Spring 2009 GMU 13

I: integer; A: array[20] of integer; B: array[20] of ^integer; I := B[A[2]]^ I Example D id : T ; D I integer Parse Tree P S integer CS 540 Spring 2009 GMU 14

I: integer; A: array[20] of integer; B: array[20] of ^integer; I := B[A[2]]^ array Example I A D Parse Tree id : T ; D I integer id : T ; D A P array[20] of T S integer 20 integer CS 540 Spring 2009 GMU 15

I: integer; A: array[20] of integer; B: array[20] of ^integer; I := B[A[2]]^ array 20 array pointer Example I A B D Parse Tree P id : T ; D I integer id : T ; D A array[20] of T id : T ; D B integer array[20] of T S 20 integer ^ T integer CS 540 Spring 2009 GMU 16

Typechecking Expressions E int_literal { E.type := integer; } E float_literal { E.type = float; } E id { E.type := lookup(id.name); } E E 1 + E 2 { if (E 1.type = integer & E 2.type = integer) then E.type = integer; else if (E 1.type = float & E 2.type = float) then E.type = float; else type_error(); } E E 1 [ E 2 ] { if (E 1.type = array of T & E 2.type = integer) E E 1^ then E.type = T; else } { if (E 1.type = ^T) then E.type = T; else } These rules define a type system for the language CS 540 Spring 2009 GMU 17

I: integer; A: array[20] of integer; B: array[20] of ^integer; I := B[A[2]]^ Example P D S array I A B id := E E ^ array 20 pointer E [ E ] id E [ E ] 20 integer id num CS 540 Spring 2009 GMU 18

I: integer; A: array[20] of integer; B: array[20] of ^integer; I := B[A[2]]^ Example P D ; S array I A B id := E I E ^ array 20 pointer E [ E ] id B E [ E ] 20 integer id num A CS 540 Spring 2009 GMU 19

I: integer; A: array[20] of integer; B: array[20] of ^integer; I := A[B[2]]^ Example P D ; S Type error! array I A B id := E I E ^ array 20 pointer E [ E ] id A E [ E ] 20 integer id num B CS 540 Spring 2009 GMU 20

Typechecking Statements S S 1 ; S 1 {if S 1.type = void & S 1.type = void) then S.type = void; else error(); } S id := E { if lookup(id.name) = E.type then S.type = void; else error(); } S if E then S 1 { if E.type = boolean and S 1.type = void then S.type = void; else error();} In this case, we assume that statements do not have types (not always the case). CS 540 Spring 2009 GMU 21

Typechecking Statements What if statements have types? S S 1 ; S 2 S id := E {S.type = S 2.type;} { if lookup(id.name) = E.type then S.type = E.type; else error(); } S if E then S 1 else S 2{ if (E.type = boolean & S1.type = S 2.type) then } S.type = S 1.type; else error(); CS 540 Spring 2009 GMU 22

Untyped languages Single type that contains all values Ex: Lisp program and data interchangeable Assembly languages bit strings Checking typically done at runtime CS 540 Spring 2009 GMU 23

Typed languages Variables have nontrivial types which limit the values that can be held. In most typed languages, new types can be defined using type operators. Much of the checking can be done at compile time! Different languages make different assumptions about type semantics. CS 540 Spring 2009 GMU 24

Components of a Type System Base Types Compound/Constructed Types Type Equivalence Inference Rules (Typechecking) Different languages make different choices! CS 540 Spring 2009 GMU 25

Base (built-in) types Numbers Multiple integer, floating point precision Characters Booleans CS 540 Spring 2009 GMU 26

Constructed Types Array String Enumerated types Record Pointer Classes (OO) and inheritance relationships Procedure/Functions CS 540 Spring 2009 GMU 27

Type Equivalence Two types: Structural and Name Type A = Bool Type B = Bool In Structural equilivance: Types A and B match because they are both boolean. In Name equilivance: A and B don t match because they have different names. CS 540 Spring 2009 GMU 28

Implementing Structural Equivalence To determine whether two types are structurally equilivant, traverse the types: boolean equiv(s,t) { if s and t are same basic type return true if s = array(s1,s2) and t is array(t1,t2) return equiv(s1,t1) & equiv(s2,t2) if s = pointer(s1) and t = pointer(t1) return equiv(s1,t1) return false; } CS 540 Spring 2009 GMU 29

Other Practical Type System Issues Implicit versus explicit type conversions Explicit user indicates (Ada) Implicit built-in (C int/char) -- coercions Overloading meaning based on context Built-in Extracting meaning parameters/context Objects (inheritance) Polymorphism CS 540 Spring 2009 GMU 30

OO Languages Data is organized into classes and sub-classes Top level is class of all objects Objects at any level inherit the attributes (data, functions) of objects higher up in the hierarchy. The subclass has a larger set of properties than the class. Subclasses can override behavior inherited from parent classes. (But cannot revise private data elements from a parent). CS 540 Spring 2009 GMU 31

class A { public: A() {cout << "Creating A\n"; } W() {cout << "W in A\n"; } }; class B: public A { public: B() {cout << "Creating B\n"; } S() {cout << "S in B\n"; } }; class C: public A { public: C() {cout << "Creating C\n"; } Y() {cout << "Y in C\n"; } }; class D: public C { public: D() {cout << "Creating D\n"; } S() {cout << "S in D\n"; } }; B (S) Object A (W) C (Y) D (S) CS 540 Spring 2009 GMU 32

The Code: B b; D d; b.w(); b.s(); d.w(); d.y(); d.s(); Output: Creating A Creating B Creating A Creating C Creating D W in A S in B W in A Y in C S in D B (S) Object A (W) C (Y) D (S) CS 540 Spring 2009 GMU 33

OO Principle of Substitutability Subclasses possess all data areas associated with parent classes Subclasses implement (through inheritance) at least all functionality defined for the parent class If we have two classes, A and B, such that class B is a subclass of A (perhaps several times removed), it should be possible to substitute instances of class B for instances of class A in any situation with no observable effect. CS 540 Spring 2009 GMU 34

Typechecking OO languages Without inheritance, the task would be relatively simple (similar to records) Difficulties: Method overriding When can super/sub types be used? Consider function f: A B Actual parameter of type A or subtype of A Return type B or supertype of B Multiple inheritance CS 540 Spring 2009 GMU 35

Function parameters Function parameters make typechecking more difficult procedure mlist(lptr: link; procedure p) while lptr <> nil begin p(lptr); lptr = lptr next; end end CS 540 Spring 2009 GMU 36

Polymorphism Functions statements in body can be executed on arguments with different type common in OO languages because of inheritance Ex: Python for determining the length of a list def size (lis): if null(lis): return 0 else: return size(lis[1:]) + 1; size([ sun, mon, tue ]) size([10,11,12]) size(a) CS 540 Spring 2009 GMU 37

Type Inferencing def size (lis): if null(lis): return 0 else: return size(lis[1:])+1; Expression size lis Type Goal: determine a type for size so we can typecheck the calls. Greek symbols are type variables. Fig 6.30 of your text CS 540 Spring 2009 GMU 38

Type Inferencing def size (lis): if null(lis): return 0 else: return size(lis[1:])+1; Built-in language constructs and functions provide clues. Expression size lis if null null(lis) Type list( n ) ) bool x i x i i list( n ) bool bool Given what we have in the table, we now know that list( n ) = Fig 6.30 of your text CS 540 Spring 2009 GMU 39

Type Inferencing def size (lis): if null(lis): return 0 else: return size(lis[1:])+1; i = int Expression size lis if null null(lis) 0 + lis[1:] Type list( n ) ) bool x i x i i list( n ) bool bool int int x int int list( n ) Fig 6.30 of your text CS 540 Spring 2009 GMU 40

Type Inferencing def size (lis): if null(lis): return 0 else: return size(lis[1:])+1; int All of this tells us that size: list( ) int (in other words, maps from anything with type list to type integer) Fig 6.30 of your text Expression size lis if null null(lis) 0,1 + lis[1:] size(lis[1:]) size(lis[1:]) + 1 if( ) Type list( n ) ) bool x i x i i list( n ) bool bool int int x int int list( n ) int int CS 540 Spring 2009 GMU 41

Formalizing Type Systems Mathematical characterizations of the type system Type soundness theorems. Requires formalization of language syntax, static scoping rules and semantics. Formalization of type rules http://research.microsoft.com/users/luca/papers/typesystems.pdf CS 540 Spring 2009 GMU 42

Part II: Scope

Scope In most languages, a complete program will contain several different namespaces or scopes. Different languages have different rules for namespace definition CS 540 Spring 2009 GMU 44

Fortran 77 Name Space Global f1() variables parameters labels common block a common block b f2() variables parameters labels f3() variables parameters labels Global scope holds procedure names and common block names. Procedures have local variables parameters, labels and can import common blocks CS 540 Spring 2009 GMU 45

Scheme Name Space Global map 2 f2() cons f1() let var All objects (built-in and user-defined) reside in single global namespace let expressions create nested lexical scopes let let CS 540 Spring 2009 GMU 46

C Name Space Global a,b,c,d,... File scope static names x,y,z f1() variables parameters labels Block Scope variables labels File scope static names w,x,y f2() f3() variables variables, param Block scope Block scope Global scope holds variables and functions No function nesting Block level scope introduces variables and labels File level scope with static variables that are not visible outside the file (global otherwise) CS 540 Spring 2009 GMU 47

Java Name Space Public Classes package p1 public class c1 fields: f1,f2 method: m1 locals method: m2 locals class c2 fields: f3 method: m3 package p2 package p3 Limited global name space with only public classes Fields and methods in a public class can be public visible to classes in other packages Fields and methods in a class are visible to all classes in the same package unless declared private Class variables visible to all objects of the same class. CS 540 Spring 2009 GMU 48

Scope Each scope maps a set of variables to a set of meanings. The scope of a variable declaration is the part of the program where that variable is visible. CS 540 Spring 2009 GMU 49

Referencing Environment The referencing environment at a particular location in source code is the set of variables that are visible at that point. A variable is local to a procedure if the declaration occurs in that procedure. A variable is non-local to a procedure if it is visible inside the procedure but is not declared inside that procedure. A variable is global if it occurs in the outermost scope (special case of non-local). CS 540 Spring 2009 GMU 50

Types of Scoping Static scope of a variable determined from the source code. Most Closely Nested Used by most languages Dynamic current call tree determines the relevant declaration of a variable use. CS 540 Spring 2009 GMU 51

Static: Most Closely Nested Rule The scope of a particular declaration is given by the most closely nested rule The scope of a variable declared in block B, includes B. If x is not declared in block B, then an occurrence of x in B is in the scope of a declaration of x in some enclosing block A, such that A has a declaration of x and A is more closely nested around B than any other block with a declaration of x. CS 540 Spring 2009 GMU 52

Example Program: Static Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main What is visible at this point (globally)? CS 540 Spring 2009 GMU 53

Example Program: Static Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main What is visible at this point (sub1)? CS 540 Spring 2009 GMU 54

Example Program: Static Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main What is visible at this point (sub3)? CS 540 Spring 2009 GMU 55

Example Program: Static Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main What is visible at this point (sub2)? CS 540 Spring 2009 GMU 56

Dynamic Scope Based on calling sequences of program units, not their textual layout (temporal versus spatial) References to variables are connected to declarations by searching the chain of subprogram calls (runtime stack) that forced execution to this point CS 540 Spring 2009 GMU 57

Scope Example MAIN - declaration of x SUB1 - declaration of x -... call SUB2... SUB2... - reference to x -...... call SUB1 MAIN calls SUB1 SUB1 calls SUB2 SUB2 uses x Which x?? CS 540 Spring 2009 GMU 58

Scope Example MAIN - declaration of x SUB1 - declaration of x -... call SUB2... SUB2... - reference to x -...... call SUB1 MAIN calls SUB1 SUB1 calls SUB2 SUB2 uses x For static scoping, it is main s x CS 540 Spring 2009 GMU 59

Scope Example In a dynamic-scoped language, the referencing environment is the local variables plus all visible variables in all active subprograms. A subprogram is active if its execution has begun but has not yet terminated. CS 540 Spring 2009 GMU 60

MAIN (x) SUB1 (x) SUB2 MAIN Scope Example - declaration of x SUB1 - declaration of x -... call SUB2... SUB2... - reference to x -...... call SUB1 MAIN calls SUB1 SUB1 calls SUB2 SUB2 uses x For dynamic scoping, it is sub1 s x CS 540 Spring 2009 GMU 61

Dynamic Scoping Evaluation of Dynamic Scoping: Advantage: convenience (easy to implement) Disadvantage: poor readability, unbounded search time CS 540 Spring 2009 GMU 62

Part III: Symbol Tables

Symbol Table Primary data structure inside a compiler. Stores information about the symbols in the input program including: Type (or class) Size (if not implied by type) Scope Scope represented explicitly or implicitly (based on table structure). Classes can also be represented by structure one difference = information about classes must persist after have left scope. Used in all phases of the compiler. CS 540 Spring 2009 GMU 64

Symbol Table Object Symbol table functions are called during parsing: Insert(x) A new symbol is defined. Delete(x) The lifetime of a symbol ends. Lookup(x) A symbol is used. EnterScope(s) A new scope is entered. ExitScope(s) A scope is left. CS 540 Spring 2009 GMU 65

Scope and Parsing func_decl : FUNCTION NAME {EnterScope($2);} parameter decls stmts ; {ExitScope($2); } decl : name : type {Insert($1,$3); } statements: id := expression {lookup($1);} expression: id {lookup($1);} Note: This is a greatly simplified grammar including only the symbol table relevant productions. CS 540 Spring 2009 GMU 66

Symbol Table Implementation Variety of choices, including arrays, lists, trees, heaps, hash tables, Different structures may be used for local tables versus tables representing scope. CS 540 Spring 2009 GMU 67

Example Implementation Local level within a scope, use a table or linked list. Global each scope is represented as a structure that points at Its local symbols The scopes that it encloses } Its enclosing scope A tree? CS 540 Spring 2009 GMU 68

Implementing the table Need variable CS for current scope EnterScope creates a new record that is a child of the current scope. This scope has new empty local table. Set CS to this record. ExitScope set CS to parent of current scope. Update tables. Insert add a new entry to the local table of CS Lookup Search local table of CS. If not found, check the enclosing scope. Continue checking enclosing scopes until found or until run out of scopes. CS 540 Spring 2009 GMU 69

Example Program Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main sub2 Main sub1 c,d sub3 a,b,c, sub1 a,d, sub2, sub3 a CS 540 Spring 2009 GMU 70

Implementing the table We can use a stack instead!!! EnterScope creates a new record that is a child of the current scope. This scope has new empty local table. Set CS to this record PUSH ExitScope set CS to parent of current scope. Update tables POP Insert add a new entry to the local table of CS Lookup Search local table of CS. If not found, check the enclosing scope. Continue checking enclosing scopes until found or until run out of scopes. CS 540 Spring 2009 GMU 71

Example Program As we compile Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main Main a,b,c CS 540 Spring 2009 GMU 72

Example Program Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main Main sub1 a,d a,b,c, sub1 CS 540 Spring 2009 GMU 73

Example Program Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main Main sub1 sub2 c,d a,d sub2 a,b,c, sub1 CS 540 Spring 2009 GMU 74

Example Program Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main Main sub1 sub3 a,b,c, sub1 a,d sub2, sub3 a CS 540 Spring 2009 GMU 75

Example Program Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main Main sub1 a,b,c, sub1 a,d, sub2, sub3 CS 540 Spring 2009 GMU 76

Example Program Program main; a,b,c: real; procedure sub1(a: real); d: int; procedure sub2(c: int); d: real; body of sub2 procedure sub3(a:int) body of sub3 body of sub1 body of main Main a,b,c, sub1 CS 540 Spring 2009 GMU 77