The compilation process is driven by the syntactic structure of the program as discovered by the parser

Similar documents
Semantic Analysis and Type Checking

Acknowledgement. CS Compiler Design. Semantic Processing. Alternatives for semantic processing. Intro to Semantic Analysis. V.

5. Semantic Analysis!

5. Semantic Analysis. Mircea Lungu Oscar Nierstrasz

Symbol Tables. For compile-time efficiency, compilers often use a symbol table: associates lexical names (symbols) with their attributes

5. Semantic Analysis. Mircea Lungu Oscar Nierstrasz

Symbol Table Information. Symbol Tables. Symbol table organization. Hash Tables. What kind of information might the compiler need?

CA Compiler Construction

1 Lexical Considerations

Runtime management. CS Compiler Design. The procedure abstraction. The procedure abstraction. Runtime management. V.

Short Notes of CS201

Lexical Considerations

G Programming Languages - Fall 2012

CS201 - Introduction to Programming Glossary By

Alternatives for semantic processing

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

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

G Programming Languages Spring 2010 Lecture 4. Robert Grimm, New York University

Lexical Considerations

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

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

The role of semantic analysis in a compiler

Lecture 16: Static Semantics Overview 1

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

Context-sensitive analysis. Semantic Processing. Alternatives for semantic processing. Context-sensitive analysis

SEMANTIC ANALYSIS TYPES AND DECLARATIONS

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

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

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

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

Intermediate Code Generation

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

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

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

Semantic Analysis. Lecture 9. February 7, 2018

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

The Decaf Language. 1 Lexical considerations

Type systems. Static typing

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

Type Checking. Error Checking

A Short Summary of Javali

The Procedure Abstraction

Introduction to Programming Using Java (98-388)

Acknowledgement. CS Compiler Design. Intermediate representations. Intermediate representations. Semantic Analysis - IR Generation

Type Checking. Outline. General properties of type systems. Types in programming languages. Notation for type rules.

Programming Languages Third Edition. Chapter 7 Basic Semantics

Outline. General properties of type systems. Types in programming languages. Notation for type rules. Common type rules. Logical rules of inference

Design issues for objectoriented. languages. Objects-only "pure" language vs mixed. Are subclasses subtypes of the superclass?

COMP 181. Agenda. Midterm topics. Today: type checking. Purpose of types. Type errors. Type checking

Procedure and Object- Oriented Abstraction

Intermediate Formats. for object oriented languages

Today's Topics. CISC 458 Winter J.R. Cordy

CS558 Programming Languages

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

Compilers CS S-05 Semantic Analysis

The Structure of a Syntax-Directed Compiler

CS 314 Principles of Programming Languages. Lecture 11

UNIT-4 (COMPILER DESIGN)

Naming in OOLs and Storage Layout Comp 412

Compiler construction

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

Intermediate Formats. for object oriented languages

The Decaf language 1

Final CSE 131B Spring 2004

CSE 307: Principles of Programming Languages

Programming Languages

Module 27 Switch-case statements and Run-time storage management

Intermediate Representations & Symbol Tables

Run-time Environments

What about Object-Oriented Languages?

Run-time Environments

Introduction to optimizations. CS Compiler Design. Phases inside the compiler. Optimization. Introduction to Optimizations. V.

Informatica 3 Syntax and Semantics

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

Run-time Environments. Lecture 13. Prof. Alex Aiken Original Slides (Modified by Prof. Vijay Ganesh) Lecture 13

Register allocation. instruction selection. machine code. register allocation. errors

Lecture08: Scope and Lexical Address

Chapter 4: LR Parsing

Every language has its own scoping rules. For example, what is the scope of variable j in this Java program?

Operational Semantics of Cool

Tail Calls. CMSC 330: Organization of Programming Languages. Tail Recursion. Tail Recursion (cont d) Names and Binding. Tail Recursion (cont d)

System Software Assignment 1 Runtime Support for Procedures

CS 132 Compiler Construction

When do We Run a Compiler?

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

CS558 Programming Languages

CS143 Handout 03 Summer 2012 June 27, 2012 Decaf Specification

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

The Procedure Abstraction Part I: Basics

Time : 1 Hour Max Marks : 30

Chapter 5 Names, Bindings, Type Checking, and Scopes

(Not Quite) Minijava

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

Chapter 5: Procedural abstraction. Function procedures. Function procedures. Proper procedures and function procedures

CS558 Programming Languages. Winter 2013 Lecture 3

CS 415 Midterm Exam Spring 2002

CS 314 Principles of Programming Languages

Intermediate Formats. Martin Rinard Laboratory for Computer Science

CSC 467 Lecture 13-14: Semantic Analysis

Inheritance. Transitivity

Transcription:

Semantic Analysis The compilation process is driven by the syntactic structure of the program as discovered by the parser Semantic routines: interpret meaning of the program based on its syntactic structure two purposes: finish analysis by deriving context-sensitive information begin synthesis by generating the IR or target code associated with individual productions of a context free grammar or subtrees of a syntax tree Copyright c 2010 by Antony L. Hosking. Copyright c 2010 by Antony L. Hosking. Permission to make digital or hard copies of part or all of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and full citation on the first page. To copy otherwise, to republish, to post on servers, or to redistribute to lists, requires prior specific permission and/or fee. Request permission to publish from hosking@cs.purdue.edu. 1

Context-sensitive analysis What context-sensitive questions might the compiler ask? 1. Is x scalar, an array, or a function? 2. Is x declared before it is used? 3. Are any names declared but not used? 4. Which declaration of x does this reference? 5. Is an expression type-consistent? 6. Does the dimension of a reference match the declaration? 7. Where can x be stored? (heap, stack,...) 8. Does *p reference the result of a malloc()? 9. Is x defined before it is used? 10. Is an array reference in bounds? 11. Does function foo produce a constant value? 12. Can p be implemented as a memo-function? These cannot be answered with a context-free grammar 2

Context-sensitive analysis Why is context-sensitive analysis hard? answers depend on values, not syntax questions and answers involve non-local information answers may involve computation Several alternatives: abstract syntax tree (attribute grammars) symbol tables language design specify non-local computations automatic evaluators central store for facts express checking code simplify language avoid problems 3

Symbol tables For compile-time efficiency, compilers use a symbol table: associates lexical names (symbols) with their attributes What items should be entered? variable names defined constants procedure and function names literal constants and strings source text labels compiler-generated temporaries Separate table for structure layouts (types) (we ll get there) (field offsets and lengths) A symbol table is a compile-time structure 4

Symbol table information What kind of information might the compiler need? textual name data type dimension information declaring procedure lexical level of declaration storage class offset in storage if record, pointer to structure table if parameter, by-reference or by-value? can it be aliased? to what other names? number and type of arguments to functions (for aggregates) (base address) 5

Nested scopes: block-structured symbol tables What information is needed? when asking about a name, want most recent declaration declaration may be from current scope or outer scope innermost scope overrides outer scope declarations Key point: new declarations (usually) occur only in current scope What operations do we need? void put (Symbol key, Object value) bind key to value Object get(symbol key) return value bound to key void beginscope() remember current state of table void endscope() close current scope and restore table to state at most recent open beginscope May need to preserve list of locals for the debugger 6

Attribute information Attributes are internal representation of declarations Symbol table associates names with attributes Names may have different attributes depending on their meaning: variables: type, procedure level, frame offset types: type descriptor, data size/alignment constants: type, value procedures: formals (names/types), result type, block information (local decls.), frame size 7

Type expressions Type expressions are a textual representation for types: 1. basic types: boolean, char, integer, real, etc. 2. type names 3. constructed types (constructors applied to type expressions): (a) array(i,t) denotes array of elements type T, index type I e.g., array(1...10,integer) (b) T 1 T 2 denotes Cartesian product of type expressions T 1 and T 2 (c) records: fields have names e.g., record((a integer),(b real)) (d) pointer(t) denotes the type pointer to object of type T (e) D R denotes type of function mapping domain D to range R e.g., integer integer integer 8

!! Type descriptors Type descriptors are compile-time structures representing type expressions e.g., char char pointer(integer) pointer or pointer char char integer char integer 9

Type compatibility Type checking needs to determine type equivalence Two approaches: Name equivalence: each type name is a distinct type Structural equivalence: two types are equivalent iff. they have the same structure (after substituting type expressions for type names) s t iff. s and t are the same basic types array(s 1,s 2 ) array(t 1,t 2 ) iff. s 1 t 1 and s 2 t 2 s 1 s 2 t 1 t 2 iff. s 1 t 1 and s 2 t 2 pointer(s) pointer(t) iff. s t s 1 s 2 t 1 t 2 iff. s 1 t 1 and s 2 t 2 10

Type compatibility: example Consider: type link = cell; var next : link; last : link; p : cell; q, r : cell; Under name equivalence: next and last have the same type p, q and r have the same type p and next have different type Under structural equivalence all variables have the same type Ada/Pascal/Modula-2/Tiger are somewhat confusing: they treat distinct type definitions as distinct types, so p has different type from q and r 11

Type compatibility: Pascal-style name equivalence Build compile-time structure called a type graph: each constructor or basic type creates a node each name creates a leaf (associated with the type s descriptor) last p q r next = pointer pointer pointer link cell Type expressions are equivalent if they are represented by the same node in the graph 12

Type compatibility: recursive types Consider: type link = cell; cell = record info : integer; next : link; end; We may want to eliminate the names from the type graph Eliminating name link from type graph for record: cell =record info integer next pointer 13 cell

Type compatibility: recursive types Allowing cycles in the type graph eliminates cell: cell =record info integer next pointer 14

Java inheritance: field overloading Fields declared in a subclass can overload fields declared in superclasses Overloading is same name used in different contexts to refer to different things, such as different fields Consider: class A { int j; } class B extends A { int j; } A a = new A();// let s call this object X // X has one field, named j, declared in A a.j = 1; // assigns 1 to the field j of X declared in A a = new B(); // let s call this object Y // Y has two fields, both named j, // one declared in A, the other in B a.j = 2; // assigns 2 to the field j of Y declared in A B b = a; b.j = 3; // assigns 3 to the field j of Y declared in B 15

Java inheritance: method overriding Methods declared in subclasses can override methods declared in superclasses Overriding is same name used to name a different thing, regardless of context, such as methods in subclasses with the same name Consider: class A { int j; void set_j(int i) { this.j = i; } class B extends A { int j; void set_j(int i) { this.j = i; } A a = new A();// let s call this object X a.set_j(1); // assigns 1 to the field j of X declared in A // i.e., invokes A set_j method a = new B(); // let s call this object Y a.set_j(2); // assigns 2 to the field j of Y declared in B // i.e., invokes B set_j method B b = a; b.set_j(3); // assigns 3 to the field j of Y declared in B // i.e. invokes B set_j method 16

Java method overloading Java also supports method overloading, which has nothing to do with inheritance Consider: class A { int j; boolean b; void set(int i) { this.j = i; } void set(boolean b) { this.j = b; } } Don t confuse method overloading with method overriding 17