1 / 37

Modern Compiler Design

favian
Download Presentation

Modern Compiler Design

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


    1. 1 Mooly Sagiv and Greta Yorsh School of Computer Science Tel-Aviv University gretay@post.tau.ac.il http://www.cs.tau.ac.il/~gretay Modern Compiler Design

    2. 2 What’s Wrong ? Let y : Int in x + 3 Let y : String? “abc” in y + 3

    3. 3 Today Goals: Semantic checks - scoping rules Symbol tables Next week Type checking

    4. 4 Cool Semantic Analysis ? All identifiers are declared Types Inheritance relations Classes defined only once Methods in a class defined only once Reserved identifiers are not misused Number of arguments (in call) matches the number of formals (in declaration) and the corresponding types …

    5. 5 Semantic Analysis Checking for “correct meaning” Warn about dubious meaning Long-distance and deep relations Lexer and parser are only short-distance Implemented using AST traversals

    6. 6 Scope of an identifier The part of the program in which the identifier is accessible or visible An identifier may have restricted scope Same identifier may refer to different things in different parts of the program Different scopes for same name don’t overlap Not all kinds of identifiers follow the most-closely nested rule

    7. 7 Scopes

    8. 8 Where do identifiers come from ? (How do we introduce identifier bindings in Cool ?) Let expressions Formal parameters Attribute definitions Case expressions Class declarations (class names) Method declarations (method names)

    9. 9 Scope rules Match identifier declarations with uses Why ? for type checking… Let y : String ? “abc” in y + 3 Static scope - depends only on the program text, not runtime behavior

    10. 10 Scope of Let “most-closely nested” rule let x : Int ? 0 in { x; let x : Int ? 2 in x; x; }

    11. 11 Scope of Class Definitions Cannot be nested Globally visible Class name can be used before it is defined Class Foo { … let y : Bar in … } Class Bar { … }

    12. 12 Scope of Attributes Global within the class in which they are defined Can be used before defined in the class Class Foo { f() : Int { a }; a : Int ? 0; }

    13. 13 Scope of Methods Method need not be defined in the class in which it is used, but in some parent class Overriding - methods may be redefined class A { foo():Int { …}; }; class B inherits A { }; class C { b : B ? new B; bar():Int{ b.foo() }; };

    14. 14 Scope of Methods Overriding - methods may be redefined class A { foo():Int { …}; }; class B inherits A { foo():Int {…}; }; class C { b : B ? new B; bar():Int{ b.foo() }; };

    15. 15 Some Cool Scope Rules local variable declared before use attributes need not be declared before use variables cannot be defined multiple times in same scope, but can be redefined in nested scopes class A { x : String ? “a”; foo(x : Int, x : String): SELF_TYPE{ x }; }; it is allowed to shadow method parameters

    16. 16 What is Symbol Table ? Scopes implemented using symbol tables Data-structure for “look-up” key – identifier value – type of identifier, other semantic properties

    17. 17 Symbol Table - 1st Attempt

    18. 18 Symbol Table - 1st Attempt

    19. 19 Implementing Scopes Let x : Int ? 0 in e before processing e add definition of x to current definitions override any other definition of x after processing e remove definition of x restore old definition of x

    20. 20 Symbol Table – 2nd Attempt

    21. 21 Symbol Table – 2nd Attempt

    22. 22 Symbol Table Lookup

    23. 23 Symbol Table Lookup

    24. 24 Symbol Table Construction

    25. 25 Symbol Table Construction via AST Traversal

    26. 26 Symbol Table Construction via AST Traversal

    27. 27 Implementation SymbolTable.java symbol table - stack of scopes scope – hash table <key, value> key is AbstractSymbol value is Object generic – do we need store and lookup in other cases ? SymtabExample.java

    28. 28 Our Implementation Support

    29. 29 Your Implementation Should … Symbol table key should combine id and kind separating table in advance according to kinds method, attribute/local variable bindings, classes implement using 2-level maps (kind->id->value) implement this using key objects ( (kind,id)->value) )

    30. 30 Symbol Tables (cont’d) class A { foo() { bar(); } bar() { … } }

    31. 31 Symbol Tables - Naďve solution Building visitor Propagates (at least) a reference to the symbol table of the current scope In some cases have to use type information (inherits) Checking visitor On visit to node – perform check using symbol tables Resolve identifiers Try to find symbol in table hierarchy In some cases have to use global type table and type information You may postpone these checks

    32. 32 Symbol Tables – less naďve solution Use forward references And/or construct some of the symbol table during parsing

    33. 33 Symbol Tables (cont’d) class A { foo() { bar(); } bar() { … } }

    34. 34 Forward References Optimistically assume that symbol will be eventually defined Update symbol table when symbol defined Remove forward-reference marker But check correctness when exiting scope No forward references should exist at exit

    35. 35 Passes Can we check class names using symbol table? No. Can we check class names in one pass ? No. Semantic analysis requires multiple passes probably more than 2 for Cool pass 1: gather all class names pass 2: do the checking

    36. 36 Inheritance Graph A node in the inheritance graph for each class Parent and children in the inheritance graph Predefined classes: Object, IO, Int, etc. Int, String, Bool can’t be inherited Is the class reachable/unreachable from the Object class via the "inherits from" relation? A type checking environment

    37. 37 Check Inheritance Graph Local properties base class is defined base class can be inherited from do not require traversing inheritance graph Global properties find all classes reachable from root class Object check that it really is a tree (no cycles)

    38. 38 Major Semantic Tasks initially the symbol table mapping class names to inheritance graph nodes is empty construct inheritance graph predefined classes user-defined classes check inheritance graph build symbol tables of features for each class check for Main class and main method type check all expressions

More Related