71
Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

Embed Size (px)

Citation preview

Page 1: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

1

Theory of Compilation 236360

Erez Petrank

Lecture 5: Semantic Analysis:

Page 2: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

2

This talk slides have dark background

(image source: http://www.apolloideas.com/blog/archives/201)

Page 3: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

3

Page 4: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

4

Page 5: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

5

You are here

Executable

code

exe

Source

text

txt

Compiler

LexicalAnalysi

s

Syntax Analysi

s

Parsing

Semantic

Analysis

Inter.Rep.

(IR)

Code

Gen.

chara

cters

toke

ns A

ST

(Abstra

ct Synta

x Tre

e)

An

nota

ted

AS

T

Page 6: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

6

What we want

Lexical analyzerPotato potato;Carrot carrot;x = tomato + potato + carrot

<id,tomato>,<PLUS>,<id,potato>,<PLUS>,<id,carrot>,EOF Parser

tomato is undefined, potato used before initialized, cannot add Potato and Carrot.

symbol kind type properties

x var ?

tomato var ?

potato var Potato

carrot var Carrot

Location.id=tomato

Add

Add

Location.Id=potato

Location.Id=carrot

Page 7: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

7

Syntax vs. Semantics

Syntax Program structure Formally described via context free grammars

Semantics Program meaning Formally defined as various forms of semantics (e.g.,

operational, denotational) It is actually NOT what “semantic analysis” phase

does Better name – “contextual analysis”

Page 8: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

8

Contextual Analysis Often called “Semantic analysis” Properties that cannot be formulated via CFG

Declare before use Even identifying the same word “w” re-appearing {wbw}

is not possible with a CFG. Initialization Type checking etc…

Properties that are hard to formulate via CFG e.g., “break” only appears inside a loop

Processing of the AST

Page 9: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

9

Contextual Analysis

Identification Gather information about each named item in the

program e.g., what is the declaration for each usage

Context checking Type checking e.g., the condition in an if-statement is a Boolean

Page 10: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

10

Identification

What is month_name? Forward references? Languages that don’t require declarations?

month : integer RANGE [1..12];…month := 1;while (month <= 12) { print(month_name[month]); month : = month + 1;}

Page 11: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

11

Symbol table

A table containing information about identifiers in the program

Single entry for each named item

name pos

type …

month 1 RANGE[1..12]

month_name

… …

month : integer RANGE [1..12];…month := 1;while (month <= 12) { print(month_name[month]); month : = month + 1;}

Page 12: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

12

Not so fast…

struct one_int { int i;} i;

main() { i.i = 42; int t = i.i; printf(“%d”,t); { int i = 73; printf(“%d”,i); }}

A struct field named i

A struct variable named i

Assignment to the “i” field of struct “i”

int variable named “i”

Reading the “i” field of struct “i”

Page 13: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

13

Scopes

Typically stack structured scopes

Scope entry push new empty scope element

Scope exit pop scope element and discard its content

Identifier declaration identifier created inside top scope

Identifier Lookup Search for identifier top-down in scope stack

Page 14: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

14

Scope-structured symbol table

Scope stack

0

3 P

“so”

P

“long”

//

2 P

“and”

P

“thanks”

1 P

“x”

P

“all”

//

P

“the”

P

“fish”

P

“thanks”

//

P

“x”

//

{ int the=1;int fish=2;Int thanks=3;{ int x = 42; int all = 73; { … } }}

Page 15: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

15

Scope and symbol table

Scope x Identifier -> properties Expensive lookup

A better solution hash table over identifiers

Page 16: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

16

Hash-table based Symbol Table

namemacro

decl 2 P

“x”

1 P //

namemacro

decl 2 P

“thanks”

0 P //

namemacro

decl 3 P

“so”

//

Id.info

Page 17: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

17

Keep also info by scope

Scope stack

0

3

Id.info(“so”) Id.info(“long”)

//

2

Id.info(“and”) Id.info(“thanks”)

1

Id.info(“x”) Id.info(“all”)

//

Id.info(“the”) Id.info(“fish”) Id.info(“thanks”)

//

Id.info(“x”)

//

(now just pointers to the corresponding record in the symbol table)

Page 18: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

18

Remember lexing/parsing?

How did we know to always map an identifier to the same symbol table entry?

Actually, the lexical-analyzer/parser already creates the symbol-table according to scopes.

Page 19: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

19

Semantic Checks

Scope rules Use symbol table to check that

Identifiers defined before use No multiple definition of same identifier Program conforms to scope rules

Type checking Check that types in the program are consistent How?

Page 20: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

20

Types

What is a type? Simplest answer: a set of values Integers, real numbers, booleans, …

Why do we care? Safety

Guarantee that certain errors cannot occur at runtime Abstraction

Hide implementation details (e.g., of the type on the machine)

Documentation Optimization

Page 21: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

21

Type System (textbook definition)

“A type system is a tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kinds of values they compute”

-- Types and Programming Languages / Benjamin C. Pierce

Page 22: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

22

Type System

A type system of a programming language is a way to define a “good” program Good programs = well-typed programs Bad programs = not well typed

Type checking Static typing – type checking at compile time Dynamic typing – (most) type checking at runtime

Type inference Automatically infer types for a program (or show that

there is no valid typing)

Page 23: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

23

Static typing vs. dynamic typing

Static type checking is conservative Any program that is determined to be well-typed is

free from certain kinds of errors May reject programs that cannot be statically

determined as well typed Why?

Dynamic type checking May accept more programs as valid (runtime info) Errors not caught at compile time Runtime cost

Page 24: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

24

Type Checking

Type rules specify which types can be combined with certain operator Assignment of expression to variable Formal and actual parameters of a method call

Examples

“drive” + “drink”

42 + “the answer”

stringstring

string

int string

ERROR

Page 25: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

25

Type Checking Rules

Basic Types Building blocks for the type system (type rules) e.g., int, boolean, string

Specify for each operator Types of operands Type of result

Type Expressions Array types Function types Record types / Classes

Page 26: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

26

Typing Rules

If E1 has type int and E2 has type int, then E1 + E2 has type int

E1 : int E2 : int

E1 + E2 : int

Page 27: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

27

More Typing Rules (examples)

true : boolean

E1 : int E2 : int

E1 op E2 : int

false : boolean

int-literal : int string-literal : string

op { +, -, /, *, %}

E1 : int E2 : int

E1 rop E2 : booleanrop { <=,<, >, >=}

E1 : T E2 : T

E1 rop E2 : booleanrop { ==,!=}

Page 28: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

28

And Even More Typing Rules

E1 : boolean E2 : boolean

E1 lop E2 : booleanlop { &&,|| }

E1 : int

- E1 : int

E1 : boolean

! E1 : boolean

E1 : T[]

E1.length : int

E1 : T[] E2 : int

E1[E2] : T

E1 : int

new T[E1] : T[]

Page 29: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

29

Type Checking

Traverse AST and assign types for AST nodes Use typing rules to compute node types

Alternative: type-check during parsing More complicated alternative But also more efficient

Page 30: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

30

Example

45 > 32 && !false

BinopExpr UnopExpr

BinopExpr

op=AND

op=NEGop=GT

intLiteral

val=45

intLiteral

val=32

boolLiteral

val=false

: int : int

: boolean

: boolean

: boolean

: boolean

false : boolean

int-literal : int

E1 : int E2 : int

E1 rop E2 : boolean

rop { <=,<, >, >=}

E1 : boolean E2 : boolean

E1 lop E2 : boolean

lop { &&,|| }

E1 : boolean

!E1 : boolean

Page 31: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

31

Type Declarations

So far, we ignored the fact that types can also be declared

TYPE Int_Array = ARRAY [Integer 1..42] OF Integer;

Var a : ARRAY [Integer 1..42] OF Real;

(explicitly)

(anonymously)

Page 32: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

32

Var a : ARRAY [Integer 1..42] OF Real;

TYPE #type01_in_line_73 = ARRAY [Integer 1..42] OF Real; Var a : #type01_in_line_73;

Type Declarations

Page 33: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

Strongly vs. weakly typed

Coercion Strongly typed

C, C++, Java

Weakly typed Perl, PHP

33

$a=31;$b="42x";$c=$a+$b;print $c;

main() { int a=31; char b[3]="42x"; int c=a+b;}

public class… { public static void main() { int a=31; String b ="42x"; int c=a+b; }}

warning: initialization makes integer from pointer without a cast

Output: 73

error: Incompatible type for declaration. Can't convert java.lang.String to int

perl C

Java

Page 34: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

34

Coercions (כפיה, אילוץ)

If we expect a value of type T1 at some point in the program, and find a value of type T2, is that acceptable?

float x = 3.141;int y = x;

Page 35: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

35

Forward References

Forward references must be resolved A forward reference is added to the symbol table as

a forward reference, and later updated when type declaration is met

At the end of scope, must check that all forward references have been resolved

TYPE Ptr_List_Entry = POINTER TO List_Entry;TYPE List_Entry = RECORD Element : Integer; Next : Ptr_List_Entry; END RECORD;

Page 36: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

36

Type Table

All types in a compilation unit are collected in a type table

For each type, its table entry contains: Type constructor: basic, record, array, pointer,… Size and alignment requirements

to be used later in code generation Types of components (if applicable)

e.g., types of record fields

Page 37: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

37

Type Equivalence: Name Equivalence (Used in C)

t1 not (name) equivalence to t2

Typedef t1 = ARRAY[Integer] OF Integer;Typedef t2 = ARRAY[Integer] OF Integer;

t3 equivalent to t4

Typedef t3 = ARRAY[Integer] OF Integer;Typedef t4 = t3

Page 38: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

38

t5, t6, t7 are all (structurally) equivalent

Type Equivalence: Structural Equivalence

Type t5 = RECORD c: Integer; p: POINTER TO t5; END RECORD;Type t6 = RECORD c: Integer; p: POINTER TO t6; END RECORD;Type t7 = RECORD c: Integer; p: POINTER TO RECORD c: Integer; p: POINTER to t5; END RECORD;END RECORD;

Page 39: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

39

In practice

Almost all modern languages use name equivalence for efficiency.

Page 40: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

40

l-values and r-values

What is dst? What is src? dst is a memory location where the value should be

stored (called l-value). src is a value (called r-value).

dst := src

Page 41: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

41

l-values and r-values (example)

x:= y + 1

730x42

160x47

x

y

……

170x42

160x47

x

y

……

Page 42: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

42

lvalue

rvalue

lvalue

- deref

rvalue

error -

expectedfo

un

d

l-values and r-values

Page 43: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

43

So far…

Identification matches applied occurrences of identifier to its defining occurrence

The symbol table maintains this information Type checking checks which type

combinations are legal Each node of an expression in the syntax tree

represents either an l-value (location) or an r-value (value)

Page 44: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

44

Abstract Syntax Tree (AST)

Abstract away some syntactic details of the source language

S ➞ if E then S else S | …

if (x>0) then { y = 42} else { y = 73 }

Page 45: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

45

Parse tree (concrete syntax tree)

S

0

Sif

x

E

>

{ S }

id num

thenE

( )

=

else S

{ S }

id num=

Page 46: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

46

Abstract Syntax Tree (AST)

if

0x

Assign

idnum

Rel-opop: >

idnum

Assign

Page 47: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

47

Syntax Directed Translation

The parse tree is used to drive the translation. Don’t only decide if the string is in the language, but

also perform some actions with each rule discovered. (already mentioned when we did recursive descent)

Semantic attributes Attributes attached to grammar symbols

Semantic actions How to update the attributes

Attribute grammars

Page 48: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

48

Attribute grammars

Attributes Every grammar symbol has attached attributes

Example: Expr.type

Semantic actions Every production rule can define how to assign

values to attributes Example:

Expr ➞ Expr + TermExpr.type = Expr.type when (Expr.type == Term.type) Error otherwise

Page 49: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

49

Indexed symbols

Add indexes to distinguish repeated grammar symbols Does not affect grammar (indices do not “count”) Used with semantic actions

Expr ➞ Expr + TermBecomesExpr ➞ Expr1 + Term

Now we can specify the actions clearly: Expr ➞ Expr1 + Term

Expr.type = Expr1.type when (Expr1.type == Term.type) Error otherwise

Page 50: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

50

Example

Production

Semantic Rule

D ➞ T L L.type = T.type

T ➞ int T.type = integer

T ➞ float T.type = float

L ➞ L1, id L1.type = L.type addType(id.entry,L.type)

L ➞ id addType(id.entry,L.type)

D

float

L

L id1

T

L id2

id3

float x,y,z

float float

float

float

Page 51: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

51

Attribute Evaluation

Build the AST Fill attributes of terminals with values derived

from their representation Execute evaluation rules of the nodes to

assign values until no new values can be assigned In the right order such that

No attribute value is used before its available Each attribute will get a value only once

Page 52: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

52

Dependencies

A semantic equation a = b1,…,bm requires computation of b1,…,bm to determine the value of a

The value of a depends on b1,…,bm We write a bi

Page 53: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

53

Cycles

Cycle in the dependence graph May not be able to compute attribute values

T

EE.S = T.iT.i = E.s + 1

T.i

E.s

AST Dependence graph

Page 54: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

54

Attribute Evaluation

Build the AST Build dependency graph Compute evaluation order using topological

ordering Execute evaluation rules based on topological

ordering

Works as long as there are no cycles

Page 55: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

55

Building Dependency Graph

All semantic equations take the form

attr1 = func1(attr1.1, attr1.2,…)attr2 = func2(attr2.1, attr2.2,…)

Build a directed dependency graph G For every attribute a of a node n in the AST create a

node n.a For every node n in the AST and a semantic action of

the form b = f(c1,c2,…ck) add edges of the form (ci,b)

Actions with side effects use a dummy attribute

Page 56: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

56

ExampleProduction

Semantic Rule

D ➞ T L L.type = T.type

T ➞ int T.type = integer

T ➞ float T.type = float

L ➞ L1, id L1.type = L.type addType(id.entry,L.type)

L ➞ id addType(id.entry,L.type)

Production

Semantic Rule

D ➞ T L L.type = T.type

T ➞ int T.type = integer

T ➞ float T.type = float

L ➞ L1, id L1.type = L.type L.dmy = addType(id.entry,L.type)

L ➞ id L.dmy = addType(id.entry,L.type)

Convention: Add dummy variables for side effects.

Page 57: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

57

Example

D

float

L

L id1

T

Lid2

id3

float x,y,z

type

type

dmy

entry

entry

entry

type

type

dmy

dmy

Production

Semantic Rule

D ➞ T L L.type = T.type

T ➞ int T.type = integer

T ➞ float T.type = float

L ➞ L1, id L1.type = L.type addType(id.entry,L.type)

L ➞ id addType(id.entry,L.type)

Page 58: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

58

Example

D

float

L

L id1

T

L id2

id3

float x,y,z

type typedmy

entry

entry

entry

type

type

dmy

dmy

Production

Semantic Rule

D ➞ T L L.type = T.type

T ➞ int T.type = integer

T ➞ float T.type = float

L ➞ L1, id L1.type = L.type L.dmy = addType(id.entry,L.type)

L ➞ id L.dmy = addType(id.entry,L.type)

Page 59: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

59

Topological Order

For a graph G=(V,E), |V|=k

Ordering of the nodes v1,v2,…vk such that for every edge (vi,vj) E, i < j

4 3 2

15

Example topological orders: 1 4 3 2 5, 4 1 3 5 2

Page 60: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

60

Back to example

float x,y,z

type

type

dmy

entry

entry

entry

type

type

dmy

dmy

1

2

3

4

5

7

8 9

10

6float float

ent1

ent2

ent3

float

float

floatfloat

float

Page 61: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

61

But what about cycles?

For a given attribute grammar, it is hard to detect if it has cyclic dependencies Exponential cost

Special classes of attribute grammars Our “usual trick”: sacrifice generality for efficient

computation

Page 62: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

62

Inherited vs. Synthesized Attributes

Synthesized attributes Computed from children of a node

Inherited attributes Computed from parents and siblings of a node

Attributes of tokens are technically considered as synthesized attributes

In general for a production rule: if an attribute is set in the parent, it is synthesized; if it is set in the child, it is inherited.

Page 63: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

63

Example

D

float

L

L id1

T

L id2

id3

float x,y,z

float float

float

float

inherited

synthesized

Production

Semantic Rule

D ➞ T L L.type = T.type

T ➞ int T.type = integer

T ➞ float T.type = float

L ➞ L1, id L1.type = L.type L.dmy = addType(id.entry,L.type)

L ➞ id L.dmy = addType(id.entry,L.type)

Page 64: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

64

S-attributed Grammars

Special class of attribute grammars Only uses synthesized attributes (S-attributed) No use of inherited attributes

Can be computed by any bottom-up parser during parsing

Attributes can be stored on the parsing stack Reduce operation computes the (synthesized)

attribute from attributes of children

Page 65: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

65

S-attributed Grammar: example

Production

Semantic Rule

S➞ E ; print(E.val)

E ➞ E1 + T E.val = E1.val + T.val

E ➞ T E.val = T.val

T ➞ T1 * F T.val = T1.val * F.val

T ➞ F T.val = F.val

F ➞ (E) F.val = E.val

F ➞ digit F.val = digit.lexval

Value obtained from lexical analyzer

(A simple example: values are not always obtainable during compile time.)

Page 66: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

66

example

3

F

T

E

4

F*

7

F

T

S

Lexval=3

Lexval=4

Lexval=7

val=7

val=7 val=4

val=28

val=3

val=3

val=31

print(31)

T

+Eval=2

8

Page 67: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

67

L-attributed grammars L-attributed attribute grammar when every

attribute in a production A ➞ X1…Xn is A synthesized attribute, or An inherited attribute of Xj, 1 <= j <=n that only depends

on Attributes of X1…Xj-1 to the left of Xj, or Inherited attributes of A

Such semantic attributes can be computed during a single DFS walk on the tree. When first visiting a node, we have finished traversing all

its left siblings. (Can compute inherited.) Upon completing the traversal of a node, we have

completed visiting all its descendants. (Can compute synthesized.)

Page 68: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

68

Example: typesetting

Each box is built from smaller boxes from which it gets the height and depth, and to which it sets the point size.

pointsize (ps) – size of letters in a box. Subscript text has smaller point size of o.7p.

height (ht) – distance from top of the box to the baseline

depth (dp) – distance from baseline to the bottom of the box.

Page 69: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

69

Example: typesettingproduction semantic rules

S ➞ B B.ps = 10

B ➞ B1 B2 B1.ps = B.psB2.ps = B.psB.ht = max(B1.ht,B2.ht)B.dp = max(B1.dp,B2.dp)

B ➞ B1 sub B2

B1.ps = B.psB2.ps = 0.7*B.psB.ht = max(B1.ht,B2.ht – 0.25*B.ps)B.dp = max(B1.dp,B2.dp– 0.25*B.ps)

B ➞ text B.ht = getHt(B.ps,text.lexval)B.dp = getDp(B.ps,text.lexval)

Page 70: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

Computing the attributes from left to right during a DFS traversal

procedure dfvisit (n: node);

begin

for each child m of n, from left to right

begin

evaluate inherited attributes of m;

dfvisit (m)

end;

evaluate synthesized attributes of n

end

Page 71: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1

71

Summary

Identification, synbol table Type checking Contextual analysis can move information between

nodes in the AST Even when they are not “local”, or context free.

Attribute grammars Attach attributes to variables and semantic actions

to derivation rules. Attribute evaluation

Build dependency graph, topological sort, evaluate Can sometimes be done during the parsing.

Special classes with pre-determined evaluation order: S-attributed, L-attributed