2301373semantic analysis1 checking what parsers cannot

21
2301373 Semantic Analysis 1 Semantic Analysis Checking what parsers cannot

Upload: tyrone-armstrong

Post on 31-Dec-2015

234 views

Category:

Documents


0 download

TRANSCRIPT

2301373 Semantic Analysis 1

Semantic Analysis

Checking what parsers cannot

2301373 Semantic Analysis 2

Outline Overview Attribute grammar

Attribute Semantic rule

Computing attributes Evaluation order Synthesized and Inherited attribute Computation of attributes during parsing

Type checking Type declaration Type inference

Symbol table

2301373 Semantic Analysis 3

Overview Semantics

Static semantics Data type (in some languages e.g. C, FORTRAN) Names

Run-time semantics Data value Data type (in other languages e.g. Perl)

Semantic analyzer Determine if the semantic of the program is

correct according to the definition of the language

Concern only static semantics

2301373 Semantic Analysis 4

Overview (cont’d) How to describe semantics

Associated to syntax

Syntax-directed semantics An attribute represents a semantic concept. A semantic rule (or attribute equation) is

associated to a syntactic rule. A semantic rule describes the relationship

between attributes of symbols in a syntactic rule.

2301373 Semantic Analysis 5

Attribute Grammar Language construct

Variables, function declarations, statements Attribute

Property of language construct Name, address, type, value, and scope are attributes

of variables. Return type, parameter types, return address, and

scope are attributes of functions. Syntax tree is an attributes of code sections.

Attribute equation (semantic rule) Associated with grammar production Specify the relationship between attributes of

construct in a syntactic rule. Attribute grammar

Set of attribute equations

2301373 Semantic Analysis 6

Example of Attribute Grammar Construct:

num digit

Attribute: val

Grammar num -> num digit num -> digit digit -> 0|1|…|9

Grammar rule Semantic rule

num1 -> num2 digit num1.val= num2.val*10+ digit.val

num -> digit num.val = digit.val

digit -> 0 digit.val = 0

digit -> 1 digit.val = 1

digit -> 2 digit.val = 2

digit -> 3 digit.val = 3

digit -> 4 digit.val = 4

digit -> 5 digit.val = 5

digit -> 6 digit.val = 6

digit -> 7 digit.val = 7

digit -> 8 digit.val = 8

digit -> 9 digit.val = 9

2301373 Semantic Analysis 7

Parse Tree with Attributes

numval = 45*10+5

numval = 4*10+5

digitval = 5

numval = 4

digitval = 5

digitval = 4

5

4

5

Grammar rule Semantic rule

num1 -> num2 digit num1.val= num2.val*10+ digit.val

num -> digit num.val = digit.val

digit -> 0 digit.val = 0

digit -> 1 digit.val = 1

digit -> 2 digit.val = 2

digit -> 3 digit.val = 3

digit -> 4 digit.val = 4

digit -> 5 digit.val = 5

digit -> 6 digit.val = 6

digit -> 7 digit.val = 7

digit -> 8 digit.val = 8

digit -> 9 digit.val = 9

2301373 Semantic Analysis 8

Attribute Grammar for Data Type Declaration

Grammar Ruledec -> type varListtype -> int type -> floatvarList1 -> id , varList2

varList -> id

Semantic RulevarList.dtype = type.dtypetype.dtype = inttype.dtype = realid.dtype = varList1.dtypevarList2.dtype= varList1.dtypeid.dtype = varList.dtype

type

dec

varList

floatid varList

,

id

dtype= real dtype=real

dtype=real

dtype=real

dtype=real

2301373 Semantic Analysis 9

Another Example of Attribute Grammar

Grammar Rule

Bnum -> num baseC

baseC ->o

baseC -> d

num1 -> num2 digit

num -> digit

digit -> 0|1|…|7

digit -> 8 | 9

val=19

base=8val=3

base=8val=19 base=8

base=8val=2

base=8val=2

Bnum

num

numo

baseC

digit

digit

Semantic Rule

num.base=baseC.base Bnum.val=num.val

baseC.base=8

baseC.base=10

num2.base=num1.base digit.base=num1.base

num1.val= if digit.val=error then error else

num2.val*num1.base + digit.val

num.val=digit.val digit.base=num.base

digit.val = numval(D), where D is 0, 1,…,7

digit.val = if digit.base=8 then error else numval(D), where D is 8,9

2301373 Semantic Analysis 10

Evaluation Order From semantic ruleX.a=f(X1.a1, X2.a2,…, Xn.an)

Value of a in node X depends on the values of a1 in X1, a2 in X2,…, and an in Xn.

The order of evaluation can be shown in a dependency graph, which is a directed acyclic graph (DAG).

X.a

X2.a2X1.a1 Xn.an…

X.a

X2.a2X1.a1 Xn.an…

X.a

X2.a2X1.a1 Xn.an…

X.a

X2.a2X1.a1 Xn.an…

2301373 Semantic Analysis 11

Dependency Graph: Example 1

numval = 45*10+5

numval = 4*10+5

digitval = 5

numval = 4

digitval = 5

digitval = 4

5

4

5

Grammar rule Semantic rule

num1 -> num2 digit num1.val= num2.val*10+ digit.val

num -> digit num.val = digit.val

digit -> 0 digit.val = 0

digit -> 1 digit.val = 1

digit -> 2 digit.val = 2

digit -> 3 digit.val = 3

digit -> 4 digit.val = 4

digit -> 5 digit.val = 5

digit -> 6 digit.val = 6

digit -> 7 digit.val = 7

digit -> 8 digit.val = 8

digit -> 9 digit.val = 9

2301373 Semantic Analysis 12

Dependency Graph: Example 2Grammar Ruledec -> type varListtype -> int type -> floatvarList1 -> id , varList2

varList -> id

Semantic RulevarList.dtype = type.dtypetype.dtype = inttype.dtype = realid.dtype = varList1.dtypevarList2.dtype= varList1.dtypeid.dtype = varList.dtype

type

dec

varList

floatid varList

,

id

dtype= real dtype=real

dtype=real

dtype=real

dtype=real

2301373 Semantic Analysis 13

Dependency Graph:Example 3Grammar Rule Semantic Rule

Bnum -> num baseC num.base=baseC.base Bnum.val=num.val

baseC ->o baseC.base=8

baseC -> d baseC.base=10

num1 -> num2 digit num2.base=num1.base digit.base=num1.base

num1.val= if digit.val=error then error else

num2.val*num1.base + digit.val

num -> digit num.val=digit.val digit.base=num.base

digit -> 0|1|…|7 digit.val = numval(D), where D is 0, 1,…,7

digit -> 8 | 9 digit.val = if digit.base=8 then error else numval(D), where D is 8,9Bnum

num

num o

baseC

digit

digit

2301373 Semantic Analysis 14

Rule-based Attribute Evaluation Order of attribute evaluation can be fixed

at compiler construction Attribute grammar is to be analyzed in order

to find the orger of evaluation

Used often in practice Not general method Two types of attributes

Synthesized attributes Inherited attributes

2301373 Semantic Analysis 15

Synthesized Attributes An attribute a is a

synthesized attribute if for a grammar rule A ->X1

X2 … Xn , an attribute equation with a on the

LHS is of the form A.a =

f(X1.a1, X2.a2, … Xn.an), or all dependencies point

from child to parent in the parse tree

If all attributes in an attribute grammar are synthesized attributes, the grammar is called an S-attributed grammar.

Grammar rule Semantic rule

num1 -> num2 digit num1.val= num2.val*10+ digit.val

num -> digit num.val = digit.valdigit -> 0|1|…|9 digit.val = val(D)

num

num digit

num digit

digit

5

4

5

2301373 Semantic Analysis 16

Order of Evaluation for Synthesized Attributes

Use postorder (or bottom-up) evaluation

Procedure PostEval (T:node){ for each child C of T

{ PostEval(C);}

compute all synthesized attributes of T

}

num

num digit

num digit

digit

5

4

5 4

4 5

45

5

5

455

2301373 Semantic Analysis 17

Inherited Attributes

An attribute is an inherited attribute if it is not a synthesized attribute.

An attribute grammar is an L-attributed grammar if for each inherited attribute aj at Xi in each grammar rule X -> X1 X2 … Xn depends on the value of attributes of symbols X, X1, X2,…, Xi-1.

Grammar Rule Semantic Ruledec -> type varList varList.dtype = type.dtypetype -> int type.dtype = inttype -> float type.dtype = realvarList1 -> id , varList2 id.dtype = varList1.dtype

varList -> id id.dtype = varList.dtype

type

dec

varList

float id varList,

id

2301373 Semantic Analysis 18

Order of Evaluation for Inherited Attributes

Use preorder and inorder evaluation together

Procedure Eval (T:node){ case nodeType(T) of

dec:{ Eval(typeChild(T));

varList.dtype=type.dtype;Eval(varChild(T)); }type:{ if child(T) is int then T.dtype=int;

if child(T) is float then T.dtype=real; }varList:{ leftChild(T).dtype=T.dtype;

if (rightmostChild(T) is not null) then

{rightmostChild(T).dtype=T.dtype; Eval(rightChild(T));}

}}

type

dec

varList

float id varList,

id

float

float float

float

float

2301373 Semantic Analysis 19

Another Example of Inherited AttributesProc Eval(T:node){ case Nodetype(T) of Bnum: { Eval(rightChild(T)); (leftChild(T)).base= (rightChild(T)).base;

Eval(leftChild(T)); T.val=leftChild(T).val; } baseC: { if child(T)=o then T.base=8; if child(T)=d thenT.base=10;} num: { leftChild(T).base=T.base; Eval(leftChild(T)); if (rightChild(T)!=null) then { rightChild(T).base=T.base; Eval(rightChild(T); T.val=f(T); } else T.val=leftChild(T).val; cal val} digit: { … }}

Grammar Rule Semantic Rule

Bnum -> num baseC num.base=baseC.base; Bnum.val=num.val

baseC ->o baseC.base=8

baseC -> d baseC.base=10

num1 -> num2 digit num2.case=num1.base; digit.base=num1.base;

num1.val= if digit.val=error then error else num2.val*num1.base + digit.val

num -> digit num.val=digit.val; digit.base=num.base

digit -> 0|1|…|7 digit.val = numval(D)

digit -> 8 | 9 digit.val = if digit.base=8 then error else numval(D)

Bnum

num

num o

baseC

digit

digit

base=8base=8

base=8

val=5base=8

val=5 base=8val=4

val=44val=44

2301373 Semantic Analysis 20

Evaluation Order for Synthesized + Inherited Attributes

Procedure CombinedEval(T:node){ for each child C of T

{ compute all inherited attributes of C;CombinedEval(C);

}compute all synthesized attributes of T;

}

2301373 Semantic Analysis 21

Attribute Computation During Parsing