Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1.
-
Upload
merilyn-hancock -
Category
Documents
-
view
217 -
download
1
Transcript of Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1.
![Page 1: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/1.jpg)
1
Theory of Compilation 236360
Erez Petrank
Lecture 5: Semantic Analysis:
![Page 2: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/2.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/3.jpg)
3
![Page 4: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/4.jpg)
4
![Page 5: Theory of Compilation 236360 Erez Petrank Lecture 5: Semantic Analysis: 1.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/5.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/6.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/7.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/8.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/9.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/10.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/11.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/12.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/13.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/14.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/15.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/16.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/17.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/18.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/19.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/20.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/21.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/22.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/23.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/24.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/25.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/26.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/27.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/28.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/29.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/30.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/31.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/32.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/33.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/34.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/35.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/36.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/37.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/38.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/39.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/40.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/41.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/42.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/43.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/44.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/45.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/46.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/47.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/48.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/49.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/50.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/51.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/52.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/53.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/54.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/55.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/56.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/57.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/58.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/59.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/60.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/61.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/62.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/63.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/64.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/65.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/66.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/67.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/68.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/69.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/70.jpg)
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.](https://reader035.fdocuments.us/reader035/viewer/2022062515/56649f3f5503460f94c60397/html5/thumbnails/71.jpg)
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