Theory of Compilation 236360 Erez Petrank
description
Transcript of Theory of Compilation 236360 Erez Petrank
![Page 1: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/1.jpg)
1
Theory of Compilation 236360
Erez Petrank
Lecture 5: Semantic Analysis:
![Page 2: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/3.jpg)
3
![Page 4: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/4.jpg)
4
![Page 5: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/5.jpg)
5
You are here
Executable code
exe
Sourcetext
txt
Compiler
LexicalAnalysi
s
Syntax Analysi
sParsing
Semantic
Analysis
Inter.Rep.(IR)
CodeGen.
characters
tokens AST(Abstract Syntax Tree)
Annotated AST
![Page 6: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/6.jpg)
6
What we wantLexical analyzer
Potato 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 Potatocarrot var Carrot
Location.id=tomato
Add
Add
Location.Id=potato
Location.Id=carrot
![Page 7: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/14.jpg)
14
Scope-structured symbol table
Scope stack0
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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/16.jpg)
16
Hash-table based Symbol Table
namemacrodecl 2 P
“x”
1 P //
namemacrodecl 2 P
“thanks”
0 P //
namemacrodecl 3 P
“so”
//
Id.info
![Page 17: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/17.jpg)
17
Keep also info by scope
Scope stack0
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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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
stringint string
ERROR
![Page 25: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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 : boolean
rop { <=,<, >, >=}
E1 : T E2 : T E1 rop E2 : boolean
rop { ==,!=}
![Page 28: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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 : intE1[E2] : T
E1 : int new T[E1] : T[]
![Page 29: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/30.jpg)
30
Example
45 > 32 && !false
BinopExpr UnopExpr
BinopExpr
…
op=AND
op=NEGop=GT
intLiteralval=45
intLiteralval=32
boolLiteralval=false
: int : int
: boolean
: boolean
: boolean
: boolean
false : boolean
int-literal : int
E1 : int E2 : int E1 rop E2 : booleanrop { <=,<, >, >=}
E1 : boolean E2 : boolean E1 lop E2 : boolean
lop { &&,|| }
E1 : boolean !E1 : boolean
![Page 31: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/34.jpg)
34
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 35: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/35.jpg)
35
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 36: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/36.jpg)
36
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 37: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/37.jpg)
37t5, 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 38: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/38.jpg)
38
In practice Almost all modern languages use name
equivalence for efficiency.
![Page 39: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/39.jpg)
39
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 40: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/42.jpg)
42
lvalue
rvalue
lvalue
- deref
rvalue
error -
expectedfo
und
l-values and r-values
![Page 43: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/46.jpg)
46
Abstract Syntax Tree (AST)
if
0x
Assign
id num
Rel-opop: >
id num
Assign
![Page 47: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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 + TermExpr.type = Expr1.type when (Expr1.type == Term.type) Error otherwise
![Page 50: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/50.jpg)
50
ExampleProduction
Semantic Rule
D ➞ T L L.in = T.typeT ➞ int T.type = integerT ➞ float T.type = float
L ➞ L1, id L1.in = L.in addType(id.entry,L.in)
L ➞ id addType(id.entry,L.in)
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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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)
![Page 56: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/56.jpg)
56
ExampleProduction
Semantic Rule
D ➞ T L L.in = T.typeT ➞ int T.type = integerT ➞ float T.type = floatL ➞ L1, id L1.in = L.in
addType(id.entry,L.in)L ➞ id addType(id.entry,L.in)
Production
Semantic Rule
D ➞ T L L.in = T.typeT ➞ int T.type = integerT ➞ float T.type = floatL ➞ L1, id L1.in = L.in
L.dmy = addType(id.entry,L.in)L ➞ id L.dmy = addType(id.entry,L.in)
Convention: Add dummy variables for side effects.
![Page 57: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/57.jpg)
57
Example
D
float
L
L id1
T
L id2
id3
float x,y,z
type in dm
y
entry
entry
entry
in
in
dmy
dmy
Production
Semantic Rule
D ➞ T L L.in = T.typeT ➞ int T.type = integerT ➞ float T.type = floatL ➞ L1, id L1.in = L.in
addType(id.entry,L.in)
L ➞ id addType(id.entry,L.in)
![Page 58: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/58.jpg)
58
Example
D
float
L
L id1
T
L id2
id3
float x,y,z
type in dmy
entry
entry
entry
in
in
dmy
dmy
Production
Semantic Rule
D ➞ T L L.in = T.typeT ➞ int T.type = integerT ➞ float T.type = floatL ➞ L1, id L1.in = L.in
L.dmy = addType(id.entry,L.in)
L ➞ id L.dmy = addType(id.entry,L.in)
![Page 59: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/60.jpg)
60
Back to examplefloat x,y,z
type in dm
y
entry
entry
entry
in
in
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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/63.jpg)
63
Example
D
float
L
L id1
T
L id2
id3
float x,y,z
float float
float
floatinheritedsynthesized
Production
Semantic Rule
D ➞ T L L.in = T.typeT ➞ int T.type = integerT ➞ float T.type = floatL ➞ L1, id L1.in = L.in
L.dmy = addType(id.entry,L.in)
L ➞ id L.dmy = addType(id.entry,L.in)
![Page 64: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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.valE ➞ T E.val = T.valT ➞ T1 * F T.val = T1.val * F.valT ➞ F T.val = F.valF ➞ (E) F.val = E.valF ➞ 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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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+E
val=28
![Page 67: Theory of Compilation 236360 Erez Petrank](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/html5/thumbnails/69.jpg)
69
Example: typesettingproduction semantic rulesS ➞ B B.ps = 10B ➞ B1 B2 B1.ps = B.ps
B2.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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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](https://reader035.fdocuments.us/reader035/viewer/2022062315/5681603d550346895dcf5f1c/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