Lecture 05 – Syntax analysis & Semantic Analysis Eran Yahav 1.

Slides:



Advertisements
Similar presentations
A question from last class: construct the predictive parsing table for this grammar: S->i E t S e S | i E t S | a E -> B.
Advertisements

Compiler construction in4020 – lecture 4 Koen Langendoen Delft University of Technology The Netherlands.
Compilation (Semester A, 2013/14) Lecture 6a: Syntax (Bottom–up parsing) Noam Rinetzky 1 Slides credit: Roman Manevich, Mooly Sagiv, Eran Yahav.
Compiler Principles Fall Compiler Principles Lecture 4: Parsing part 3 Roman Manevich Ben-Gurion University.
Chapter 5 Syntax-Directed Translation. Translation of languages guided by context-free grammars. Attach attributes to the grammar symbols. Values of the.
Lecture 08a – Backpatching & Recap Eran Yahav 1 Reference: Dragon 6.2,6.3,6.4,6.6.
Chapter 5 Syntax Directed Translation. Outline Syntax Directed Definitions Evaluation Orders of SDD’s Applications of Syntax Directed Translation Syntax.
Compilation (Semester A, 2013/14) Lecture 6b: Context Analysis (aka Semantic Analysis) Noam Rinetzky 1 Slides credit: Mooly Sagiv and Eran Yahav.
1 Error detection in LR parsing Errors are discovered when a slot in the action table is blank. Canonical LR(1) parsers detect and report the error as.
Mooly Sagiv and Roman Manevich School of Computer Science
1 Beyond syntax analysis An identifier named x has been recognized. Is x a scalar, array or function? How big is x? If x is a function, how many and what.
Lecture 06 – Semantic Analysis Eran Yahav 1. 2 You are here Executable code exe Source text txt Compiler Lexical Analysis Syntax Analysis Parsing Semantic.
Lecture 04 – Syntax analysis: top-down and bottom-up parsing
Theory of Compilation Erez Petrank Lecture 4: Semantic Analysis: 1.
Theory of Compilation Erez Petrank Lecture 3: Syntax Analysis: Bottom-up Parsing 1.
Abstract Syntax Tree (AST)
Table-driven parsing Parsing performed by a finite state machine. Parsing algorithm is language-independent. FSM driven by table (s) generated automatically.
Chapter 2 A Simple Compiler
Abstract Syntax Trees Lecture 14 Wed, Mar 3, 2004.
2.2 A Simple Syntax-Directed Translator Syntax-Directed Translation 2.4 Parsing 2.5 A Translator for Simple Expressions 2.6 Lexical Analysis.
Chapter 5 Syntax-Directed Translation Section 0 Approaches to implement Syntax-Directed Translation 1、Basic idea Guided by context-free grammar (Translating.
Syntax-Directed Translation
1 Semantic Analysis Aaron Bloomfield CS 415 Fall 2005.
COP4020 Programming Languages Semantics Prof. Xin Yuan.
CS412/413 Introduction to Compilers and Translators Spring ’99 Lecture 8: Semantic Analysis and Symbol Tables.
Review 1.Lexical Analysis 2.Syntax Analysis 3.Semantic Analysis 4.Code Generation 5.Code Optimization.
Chapter 5: Syntax directed translation –Use the grammar to direct the translation The grammar defines the syntax of the input language. Attributes are.
Theory of Compilation Erez Petrank Lecture 5: Semantic Analysis: 1.
Compilation /15a Lecture 5 1 * Syntax Analysis: Bottom-Up parsing Noam Rinetzky.
Compiler Principles Fall Compiler Principles Lecture 6: Parsing part 5 Roman Manevich Ben-Gurion University.
Top-Down Parsing CS 671 January 29, CS 671 – Spring Where Are We? Source code: if (b==0) a = “Hi”; Token Stream: if (b == 0) a = “Hi”; Abstract.
1 Syntax-Directed Translation Part I Chapter 5 COP5621 Compiler Construction Copyright Robert van Engelen, Florida State University, 2007.
Semantic Analysis II. Messages Please check lecturer notices in the Moodle Appeals  Legitimate: “I don’t have the bug you mentioned…”  Illegitimate:
Syntax Directed Definition and Syntax directed Translation
Compiler Principles Winter Compiler Principles Syntax Analysis (Parsing) – Part 3 Mayer Goldberg and Roman Manevich Ben-Gurion University.
Compiler Principles Fall Compiler Principles Lecture 5: Parsing part 4 Roman Manevich Ben-Gurion University.
4. Bottom-up Parsing Chih-Hung Wang
Compilation Lecture 4: Syntax Analysis Bottom Up parsing Noam Rinetzky 1.
Bernd Fischer RW713: Compiler and Software Language Engineering.
Bottom Up Parsing CS 671 January 31, CS 671 – Spring Where Are We? Finished Top-Down Parsing Starting Bottom-Up Parsing Lexical Analysis.
Compiler Principles Winter Compiler Principles Syntax Analysis (Parsing) – Part 2 Mayer Goldberg and Roman Manevich Ben-Gurion University.
Lecture 5: LR Parsing CS 540 George Mason University.
Compilers: Bottom-up/6 1 Compiler Structures Objective – –describe bottom-up (LR) parsing using shift- reduce and parse tables – –explain how LR.
Lecture 05 – Semantic Analysis Eran Yahav 1. 2 You are here Executable code exe Source text txt Compiler Lexical Analysis Syntax Analysis Parsing Semantic.
CSE 420 Lecture Program is lexically well-formed: ▫Identifiers have valid names. ▫Strings are properly terminated. ▫No stray characters. Program.
Chapter4 Syntax-Directed Translation Introduction : 1.In the lexical analysis step, each token has its attribute , e.g., the attribute of an id is a pointer.
Compiler Principles Fall Compiler Principles Lecture 5: Parsing part 4 Roman Manevich Ben-Gurion University.
Announcements/Reading
Semantic analysis Jakub Yaghob
Compilation /15a Lecture 6
A Simple Syntax-Directed Translator
Programming Languages Translator
Table-driven parsing Parsing performed by a finite state machine.
Syntax Analysis: Bottom-Up Parsing
Fall Compiler Principles Lecture 4: Parsing part 3
Syntax-Directed Translation Part I
Fall Compiler Principles Lecture 4: Parsing part 3
Top-Down Parsing CS 671 January 29, 2008.
Syntax-Directed Translation Part I
Syntax-Directed Translation Part I
Parsing #2 Leonidas Fegaras.
Lecture 4: Syntax Analysis: Botom-Up Parsing Noam Rinetzky
Parsing #2 Leonidas Fegaras.
Syntax-Directed Translation Part I
SYNTAX DIRECTED DEFINITION
Fall Compiler Principles Lecture 4: Parsing part 3
5. Bottom-Up Parsing Chih-Hung Wang
Syntax-Directed Translation Part I
Chap. 3 BOTTOM-UP PARSING
Presentation transcript:

Lecture 05 – Syntax analysis & Semantic Analysis Eran Yahav 1

2 You are here Executable code exe Source text txt Compiler Lexical Analysis Syntax Analysis Parsing Semantic Analysis Inter. Rep. (IR) Code Gen.

3 Last week: LR Parsing with Pushdown Automaton input state symbol output q0 stack iq5 GOTO Table state lookahead ACTION Table top (current state)

Last week: LR Parsing with Pushdown Automaton  s = top of stack, t = next token, use ACTION[s][t] to determine what is the next move  Shift move  Remove first token t from input  Push t on the stack  Compute next state s’ = GOTO[s][t] table  Push new state s’ on the stack  If new state is error – report error  Reduce move  Using a rule N  α  Symbols in α and their following states are removed from stack. Let q denote the state on top of stack after their removal  Push N on the stack  Compute next state s’ = GOTO[q][N] table  Push new state s’ on the stack (on top of N) 4

Last week: shift move 1. Remove first token t from input 2. Push t on the stack 3. Compute s’= GOTO[s][t] table 4. Push s’ state on the stack 5. If new state is error – report error 5 i+i$ input q0 stack +i$ input q0 stack i Statei+()$ETaction q0q5q7q1q6shift +i$ input q0 stack iq5 3+ 4

Last week: reduce move 1. Using a rule N  α (ACTION[s][t]) 2. Symbols in α and their following states are removed from stack. q = top afterwards. 3. Push N on the stack 4. New state s’= GOTO[q][N] table 5. Push new state s’ on top of N 6 +i$ input q0 stack iq5 Reduce T  i +i$ input q0 stack Statei+()$ETaction q0q5q7q1q6shift … q5r i$ input q0 stack T 3 +i$ input q0 stack T 4+5 q6 how we decided on a reduce How we picked next state

Constructing Parse Table: LR(0) Automaton Example 7 Z   E$ E   T E   E + T T   i T   (E) T  (  E) E   T E   E + T T   i T   (E) E  E + T  T  (E)  Z  E$  Z  E  $ E  E  + T E  E+  T T   i T   (E) T  i  T  (E  ) E  E  +T E  T  q0q0 q1q1 q2q2 q3q3 q4q4 q5q5 q6q6 q7q7 q8q8 q9q9 T ( i E + $ T ) + E i T (

Last week: GOTO/ACTION Table 8 Statei+()$ET q0s5s7s1s6 q1s3s2 q2r1 q3s5s7s4 q4r3 q5r4 q6r2 q7s5s7s8s6 q8s3s9 q9r5 (1)Z  E $ (2)E  T (3)E  E + T (4)T  i (5)T  ( E ) Warning: numbers mean different things! rn = reduce using rule number n sm = shift to state m

LR Parsing with Pushdown Automaton (superimposed GOTO/ACTION)  s = top of stack, t = next token, move=GOTO/ACTION[s][t] to determine what is the next move  If (move = Sm)  Remove first token t from input  Push t on the stack  Push new state m on the stack  If (move = rn)  use rule number n: N  α  Symbols in α and their following states are removed from stack. Let q denote the state on top of stack after their removal  Push N on the stack  Compute next state s’ = GOTO/ACTION[q][N] table  Push new state s’ on the stack (on top of N)  If (move = empty) report ERROR 9

GOTO/ACTION Table 10 sti+()$ET q0s5s7s1s6 q1s3s2 q2r1 q3s5s7s4 q4r3 q5r4 q6r2 q7s5s7s8s6 q8s3s9 q9r5 (1)Z  E $ (2)E  T (3)E  E + T (4)T  i (5)T  ( E ) StackInputAction q0i + i $s5 q0 i q5+ i $r4 q0 T q6+ i $r2 q0 E q1+ i $s3 q0 E q1 + q3i $s5 q0 E q1 + q3 i q5$r4 q0 E q1 + q3 T q4$r3 q0 E q1$s2 q0 E q1 $ q2r1 q0 Z top is on the right

Are we done?  Can make a transition diagram for any grammar  Can make a GOTO table for every grammar  Cannot make a deterministic ACTION table for every grammar 11

LR(0) Conflicts 12 Z  E $ E  T E  E + T T  i T  ( E ) T  i[E] Z   E$ E   T E   E + T T   i T   (E) T   i[E] T  i  T  i  [E] q0q0 q5q5 T ( i E Shift/reduce conflict … … …

LR(0) Conflicts 13 Z  E $ E  T E  E + T T  i V  i T  ( E ) Z   E$ E   T E   E + T T   i T   (E) V   i T  i  V  i  q0q0 q5q5 T ( i E reduce/reduce conflict … … …

LR(0) Conflicts  Any grammar with an  -rule cannot be LR(0)  Inherent shift/reduce conflict  A   - reduce item  P  α  Aβ – shift item  A   can always be predicted from P  α  Aβ 14

Back to the GOTO/ACTIONS tables 15 Statei+()$ETaction q0q5q7q1q6shift q1q3q2shift q2Z  E$ q3q5q7q4Shift q4E  E+T q5TiTi q6ETET q7q5q7q8q6shift q8q3q9shift q9TETE GOTO Table ACTION Table ACTION table determined only by transition diagram, ignores input

SLR Grammars  Don’t reduce if it will get you into trouble on the next token  A handle should not be reduced to a non- terminal N if the look-ahead is a token that cannot follow N  A reduce item N  α  is applicable only when the look-ahead is in FOLLOW(N)  Differs from LR(0) only on the ACTION table 16

LR(0) Conflicts 17 Z  E $ E  T E  E + T T  i T  ( E ) T  i[E] Z   E$ E   T E   E + T T   i T   (E) T   i[E] T  i  T  i  [E] q0q0 q5q5 T ( i E Shift/reduce conflict … … … FOLLOW(Z) = { $ } FOLLOW(E)= { ) + $ } FOLLOW(T)= { ) + $ } A[x]$ input

SLR ACTION Table 18 (1)Z  E $ (2)E  T (3)E  E + T (4)T  i (5)T  ( E ) Statei+()$ q0shift q1shift q2Z  E$ q3shift q4E  E+T q5TiTiTiTiTiTi q6ETETETETETET q7shift q8shift q9T  (E) Look-ahead token from the input Remember: In contrast, GOTO table is indexed by state and a grammar symbol from the stack FOLLOW(Z) = { $ } FOLLOW(E)= { ) + $ } FOLLOW(T)= { ) + $ }

SLR ACTION Table 19 Statei+()[]$ q0shift q1shift q2Z  E$ q3shift q4E  E+T q5TiTiTiTishiftTiTi q6ETETETETETET q7shift q8shift q9T  (E) vs. stateaction q0shift q1shift q2Z  E$ q3Shift q4E  E+T q5TiTi q6ETET q7shift q8shift q9TETE SLR – use 1 token look-aheadLR(0) – no look-ahead … as before… T  i T  i[E] FOLLOW(Z) = { $ } FOLLOW(E)= { ) + $ } FOLLOW(T)= { ) + $ }

Are we done? 20 (0) S’ → S (1) S → L = R (2) S → R (3) L → * R (4) L → id (5) R → L

21 S’ →  S S →  L = R S →  R L →  * R L →  id R →  L S’ → S  S → L  = R R → L  S → R  L → *  R R →  L L →  * R L →  id L → id  S → L =  R R →  L L →  * R L →  id L → * R  R → L  S → L = R  S L R id * = R * R L * L q0 q4 q7 q1 q3 q9 q6 q8 q2 q5

Shift/reduce conflict  S → L  = R vs. R → L   FOLLOW(R) contains =  S ⇒ L = R ⇒ * R = R  SLR cannot resolve the conflict either 22 S → L  = R R → L  S → L =  R R →  L L →  * R L →  id = q6 q2 (0) S’ → S (1) S → L = R (2) S → R (3) L → * R (4) L → id (5) R → L

LR(1) Grammars  In SLR: a reduce item N  α  is applicable only when the look-ahead is in FOLLOW(N)  But FOLLOW(N) merges look-ahead for all alternatives for N  LR(1) keeps look-ahead with each LR item  Idea: a more refined notion of follows computed per item 23

LR(1) Item  LR(1) item is a pair  LR(0) item  Look-ahead token  Meaning  We matched the part left of the dot, looking to match the part on the right of the dot, followed by the look-ahead token.  Example  The production L  id yields the following LR(1) items 24 [L → ● id, *] [L → ● id, =] [L → ● id, id] [L → ● id, $] [L → id ●, *] [L → id ●, =] [L → id ●, id] [L → id ●, $] (0) S’ → S (1) S → L = R (2) S → R (3) L → * R (4) L → id (5) R → L

-closure for LR(1)  For every [A → α ● Bβ, c] in S  for every production B → δ and every token b in the grammar such that b  FIRST(βc)  Add [B → ● δ, b] to S 25

26 (S’ → ∙ S, $) (S → ∙ L = R, $) (S → ∙ R, $) (L → ∙ * R, = ) (L → ∙ id, = ) (R → ∙ L, $ ) (L → ∙ id, $ ) (L → ∙ * R, $ ) (S’ → S ∙, $) (S → L ∙ = R, $) (R → L ∙, $) (S → R ∙, $) (L → * ∙ R, =) (R → ∙ L, =) (L → ∙ * R, =) (L → ∙ id, =) (L → * ∙ R, $) (R → ∙ L, $) (L → ∙ * R, $) (L → ∙ id, $) (L → id ∙, $) (L → id ∙, =) (S → L = ∙ R, $) (R → ∙ L, $) (L → ∙ * R, $) (L → ∙ id, $) (L → * R ∙, =) (L → * R ∙, $) (R → L ∙, =) (R → L ∙, $) (S → L = R ∙, $) S L R id * = R * R L * L q0 q4 q5 q7 q6 q9 q3 q1 q2 q8 (L → * ∙ R, $) (R → ∙ L, $) (L → ∙ * R, $) (L → ∙ id, $) (L → id ∙, $) (R → L ∙, $) (L → * R ∙, $) q11 q12 q10 R q13 id

Back to the conflict  Is there a conflict now? 27 (S → L ∙ = R, $) (R → L ∙, $) (S → L = ∙ R, $) (R → ∙ L, $) (L → ∙ * R, $) (L → ∙ id, $) = q6 q2

LALR  LR tables have large number of entries  Often don’t need such refined observation (and cost)  LALR idea: find states with the same LR(0) component and merge their look-ahead component as long as there are no conflicts  LALR not as powerful as LR(1) 28

Summary: LR Grammars  LR parsing techniques use item sets of proposed handles  Shift behavior similar  Differ on when to reduce  LR(0) - any reduce item causes a reduction  SLR – a reduce item N  α  causes a reduction only if the look-ahead token is in the FOLLOW set of N  LR(1) - a reduce item N  α  {  } causes a reduction only if the look-ahead token is in the set  (the look- ahead set computed for the item) 29

Summary: LR Grammars  ACTION table determines whether to shift or reduce  On a shift, new state found using the GOTO table  LR-parser with 1 token look-ahead, the ACTION and GOTO tables can be superimposed 30

Summary  Bottom up  LR Items  LR parsing with pushdown automata  LR(0), SLR, LR(1) – different kinds of LR items, same basic algorithm 31

You are here… 32 Executable code exe Source text txt Lexical Analysis Sem. Analysis Process text input characters Syntax Analysis tokens AST Intermediate code generation Annotated AST Intermediate code optimization IR Code generation IR Target code optimization Symbolic Instructions SI Machine code generation Write executable output MI Back End

What we want 33 Lexical analyzer Potato potato; Carrot carrot; x = tomato + potato + carrot,,,,,EOF Parser tomato is undefined potato used before initialized Cannot add Potato and Carrot symbolkindtypeproperties xvar? tomatovar? potatovarPotato carrotvarCarrot LocationExpr id=tomato AddExpr leftright AddExpr leftright LocationExpr id=potatoid=carrot LocationExpr

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” 34

Contextual Analysis  Often called “Semantic analysis”  Properties that cannot be formulated via CFG  Type checking  Declare before use  Identifying the same word “w” re-appearing – wbw  Initialization  …  Properties that are hard to formulate via CFG  “break” only appears inside a loop  …  Processing of the AST 35

Abstract Syntax Tree (AST)  Abstract away some syntactic details of the source language 36 S  if E then S else S | … if (x>0) then { y = 42} else { y = 73 }

Parse tree (concrete syntax tree) 37 S 0 Sif x E > { S } id num then E ( ) = else S { S } id num =

Abstract Syntax Tree (AST) 38 if 0x Assign id num Rel-op op: > id num Assign

Syntax Directed Translation  Semantic attributes  Attributes attached to grammar symbols  Semantic actions  (already mentioned when we did recursive descent)  How to update the attributes  Attribute grammars 39

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 + Term Expr.type = Expr1.type when (Expr1.type == Term.type) Error otherwise 40

Indexed symbols  Add indexes to distinguish repeated grammar symbols  Does not affect grammar  Used in semantic actions  Expr  Expr + Term Becomes Expr  Expr1 + Term 41

Example 42 ProductionSemantic Rule D  T LL.in = T.type T  intT.type = integer T  floatT.type = float L  L1, idL1.in = L.in addType(id.entry,L.in) L  idaddType(id.entry,L.in) D float L L id1 T L id2 id3 float x,y,z float

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 43

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 44

Cycles  Cycle in the dependence graph  May not be able to compute attribute values 45 T E E.S = T.i T.i = E.s + 1 T.i E.s ASTDependence graph

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 46

Building Dependency Graph  All semantic equations take the form attr1 = func1(attr1.1, attr1.2,…) attr2 = func2(attr2.1, attr2.2,…)  Actions with side effects use a dummy attribute  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) 47

Example 48 Prod.Semantic Rule D  T LL.in = T.type T  intT.type = integer T  floatT.type = float L  L1, idL1.in = L.in addType(id.entry,L.in) L  idaddType(id.entry,L.in) D float L L id1 T L id2 id3 float x,y,z type in dmy entry in dmy

Example 49 Prod.Semantic Rule D  T LL.in = T.type T  intT.type = integer T  floatT.type = float L  L1, idL1.in = L.in addType(id.entry,L.in) L  idaddType(id.entry,L.in) D float L L id1 T L id2 id3 float x,y,z type in dmy entry in dmy

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 Example topological orderings: ,

Example 51 float x,y,z type in dmy entry in dmy float ent1 ent2 ent3 float

But what about cycles?  For a given attribute grammar hard to detect if it has cyclic dependencies  Exponential cost  Special classes of attribute grammars  Our “usual trick”  sacrifice generality for predictable performance 52

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 53

example 54 ProductionSemantic Rule D  T LL.in = T.type T  intT.type = integer T  floatT.type = float L  L1, idL1.in = L.in addType(id.entry,L.in) L  idaddType(id.entry,L.in) D float L L id1 T L id2 id3 float x,y,z float inherited synthesized

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 55

S-attributed Grammar: example 56 ProductionSemantic Rule S  E ;print(E.val) E  E1 + TE.val = E1.val + T.val E  TE.val = T.val T  T1 * FT.val = T1.val * F.val T  FT.val = F.val F  (E)F.val = E.val F  digitF.val = digit.lexval

example 57 3 F T E + 4 F T E * 7 F T S Lexval=3Lexval=4 Lexval=7 val=7 val=4 val=28 val=3 val=31 31

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 58

Summary  Contextual analysis can move information between nodes in the AST  Even when they are not “local”  Attribute grammars  Attach attributes and semantic actions to grammar  Attribute evaluation  Build dependency graph, topological sort, evaluate  Special classes with pre-determined evaluation order: S-attributed, L-attributed 59

The End 60

Identification 61

Scopes 62

63 Semantic Checks  Scope rules  Use symbol table to check that  Identifiers defined before used  No multiple definition of same identifier  Program conforms to scope rules  Type checking  Check that types in the program are consistent  How?

64 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” string intstring ERROR

Type Checking Rules  Specify for each operator  Types of operands  Type of result  Basic Types  Building blocks for the type system (type rules)  e.g., int, boolean, string  Type Expressions  Array types  Function types  Record types / Classes 65

66 Typing Rules If E1 has type int and E2 has type int, then E1 + E2 has type int E1 : intE2 : int E1 + E2 : int (Generally, also use a context A)

67 More Typing Rules A  true : boolean A  E1 : intA  E2 : int A  E1 op E2 : int A  false : boolean A  int-literal : int A  string-literal : string op  { +, -, /, *, %} A  E1 : intA  E2 : int A  E1 rop E2 : boolean rop  {, >=} A  E1 : TA  E2 : T A  E1 rop E2 : boolean rop  { ==,!=}

68 And Even More Typing Rules A  E1 : booleanA  E2 : boolean A  E1 lop E2 : boolean lop  { &&,|| } A  E1 : int A  - E1 : int A  E1 : boolean A  ! E1 : boolean A  E1 : T[] A  E1.length : int A  E1 : T[]A  E2 : int A  E1[E2] : T A  E1 : int A  new T[E1] : T[] A  T \in C A  new T() : T id : T  A A  id : T

69 Type Checking  Our approach --- Traverse AST bottom-up and assign types for AST nodes  Use typing rules to compute node types  More complicated alternative --- type-check during parsing  But naturally also more efficient

70 Example 45 > 32 && !false BinopExpr UnopExpr BinopExpr … op=AND op=NEG op=GT intLiteral val=45 intLiteral val=32 boolLiteral val=false : int : boolean A :- false : boolean A :- int-literal : int A :- E1 : intA :- E2 : int A :- E1 rop E2 : boolean rop  {, >=} A :- E1 : booleanA :- E2 : boolean A :- E1 lop E2 : boolean lop  { &&,|| } A :- E1 : boolean A :- !E1 : boolean