40-414 compiler design semantic analysis symbol table
TRANSCRIPT
![Page 1: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/1.jpg)
1
40-414 Compiler Design
Lecture 7
Semantic Analysis&
Symbol Table Management
![Page 2: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/2.jpg)
2
Static versus Dynamic Checking
• Static checking: the compiler enforces programming language’s static semantics
― Program properties that can be checked at compile time
• Dynamic semantics: checked at run time
― Compiler generates verification code to enforce programming language’s dynamic semantics
![Page 3: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/3.jpg)
3
Static Checking Examples
• Type checks: in A := B + C, all operands should have the same type
• Flow-of-control checks: check whether a e.g. break statement has somewhere to return control.
• Uniqueness checks: In some languages names must be unique
• Named-related checks: In ADA for loops can have name, and it must appear twice (before the for keyword and before the end statement).
![Page 4: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/4.jpg)
4
Type Checks, Overloading, and Coercion
int op(int), op(float);int f(float);int a, c[10], d;
d = c+d; error: invalid conversion from ‘int*’ to ‘int’
d = d + c;
*d = a; error: invalid type argument of unary ‘*’
*d = a;
a = op(d); // OK: overloading (C++)
a = f(d); // OK: coercion of d to float
![Page 5: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/5.jpg)
5
Flow-of-Control Checks
myfunc(){ …break; // ERROR
}
myfunc(){ …switch (a){ case 0:
…break; // OK
case 1:…
}}
myfunc(){ …while (n){ …if (i>10)break; // OK
}}
![Page 6: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/6.jpg)
6
Uniqueness Checks
myfunc(){ int i, j, i; // ERROR …
}
myfunc(int a, int a) // ERROR{ …}
struct myrec{ int name;};struct myrec // ERROR{ int id;};
![Page 7: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/7.jpg)
7
Nested Related Checks
LoopB: for (int J = 0; J < m; J++){
LoopA: for (int I = 0; I < n; I++){ …
if (a[I] == 0)break LoopB; // Java labeled loop
…}
}
![Page 8: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/8.jpg)
8
One-Pass versus Multi-Pass Static Checking
• One-pass compiler: static checking in C, Pascal, Fortran, and many other languages is performed in one pass while intermediate code is generated(Influences design of a language: placement constraints)
• Multi-pass compiler: static checking in Ada, Java, and C# is performed in a separate phase, sometimes by traversing a syntax tree multiple times
![Page 9: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/9.jpg)
9
Dynamic Checking
• A piece of object code is added to the compiled program to perform the checking in the execution time
• Example:var a[10] int; …; read (I); a(I) := 0;
• Generated code is as such the last statement would have been:
If I <= 10 then a(I) := 0 else print (“subscript out of range error”)
![Page 10: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/10.jpg)
10
Symbol Table Management
OPERATIONS: Insert (string, token_ID)Lookup (string)
NOTICE: Reserved words are placed into symbol table for easy lookup
Attributes may be associated with each entry, i.e., typing info, size info, memory address, etc.
String Table:
Symbol Table
![Page 11: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/11.jpg)
11
Example
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;
procedure readarray;var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;
function partition(y, z: integer) : integer;var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
![Page 12: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/12.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
12
Example (Cont.)
Scope Stack
symbol table
lexeme type attributes
0
1
2
34
5
6
7
8
910
11
12
![Page 13: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/13.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
13
Example (Cont.)
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
![Page 14: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/14.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
14
Example (Cont.)
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
a intx int
![Page 15: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/15.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
15
Example (Cont.)
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
a intx int
readarray
![Page 16: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/16.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
16
Example (Cont.)
4
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
a intx int
readarrayi int
![Page 17: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/17.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
17
Example (Cont.)
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
a intx int
readarrayexchange
![Page 18: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/18.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
18
Example (Cont.)
5
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
a intx int
readarrayexchange
i intj int
![Page 19: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/19.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
19
Example (Cont.)
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
a intx int
readarrayexchange
![Page 20: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/20.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
20
Example (Cont.)
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
a intx int
readarrayexchange quicksort
![Page 21: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/21.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
21
Example (Cont.)
6
0
Scope Stack
symbol table
lexeme type attributes
sort - 0
1
2
34
5
6
7
8
910
11
12
a intx int
readarrayexchange quicksort
m intn intk intv int
![Page 22: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/22.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
22
Example (Cont.)
6
0
Scope Stack
symbol table
lexeme type attributes
sort -a intx int
readarray -exchange -quicksort -
m intn intk intv int
partition
0
1
2
34
5
6
7
8
910
11
12
![Page 23: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/23.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
23
Example (Cont.)
11
6
0
Scope Stack
symbol table
lexeme type attributes
sort -a intx int
readarray -exchange -quicksort -
m intn intk intv int
partition y intz int
0
1
2
34
5
6
7
8
910
11
12
![Page 24: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/24.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
24
Example (Cont.)
11
6
0
Scope Stack
symbol table
lexeme type attributes
sort -a intx int
readarray -exchange -quicksort -
m intn intk intv int
partition inty intz int
0
1
2
34
5
6
7
8
910
11
12
![Page 25: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/25.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
25
Example (Cont.)
11
6
0
Scope Stack
symbol table
lexeme type attributes
sort -a intx int
readarray -exchange -quicksort -
m intn intk intv int
partition inty intz int
0
1
2
34
5
6
7
8
910
11
12
i int
j int13
14
![Page 26: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/26.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
26
Example (Cont.)
6
0
Scope Stack
symbol table
lexeme type attributes
sort -a intx int
readarray -exchange -quicksort -
m intn intk intv int
partition int
0
1
2
34
5
6
7
8
910
11
12
![Page 27: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/27.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
27
Example (Cont.)
0
Scope Stack
symbol table
lexeme type attributes
sort -a intx int
readarray -exchange -quicksort -
0
1
2
34
5
6
7
8
910
11
12
![Page 28: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/28.jpg)
program sort(input, output);var a : array [0 .. 10] of integer; x : integer;procedure readarray;
var i : integer;begin … a … end;
procedure exchange( i, j, : integer);begin
x := a[i]; a[i] := a[j]; a[j] := xend
procedure quicksort(m, n: integer);var k, v : integer;function partition(y, z: integer) : integer;
var i, j : integer;begin … a …
… v …… exchange(i, j); …
end { partition };begin … end { quicksort }
begin … end { sort }.
28
Example (Cont.)
Scope Stack
symbol table
lexeme type attributes
0
1
2
34
5
6
7
8
910
11
12
![Page 29: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/29.jpg)
29
Question?
Lexical Analysisin Compile time
Which one of the modules detects the error in the given Pascal piece of code, and when?
type a = array[1..10] of integer;var i : integer; b : a;i : = 11;b[i] = 25;
Syntax Analysisin Compile time
Semantic Analysisin Compile time
Generated Codein Runtime
![Page 30: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/30.jpg)
30
Program S()Var a[1..5], c, realProcedure R(m: integer)
Var b[1..5] integerProcedure E()
Var I, c[1..3] integerc(3) := a (2) + b (1)
End EFunction Q(n: integer): integer
Var a integerProcedure P()
Var b realb := a + c
End PEnd Q
End REnd S
1234567891011121314151617
Question?
What is the state of symbol table and scope stack at the time of compiling lines 7 and 13?
![Page 31: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/31.jpg)
31
Question?
Lexical Analysisin Compile time
Which one of the modules detects the error in the given Pascal piece of code, and when?
type a = array[1..10] of integer;var i : integer; b : a;i : = 11;b[i] = 25;
Syntax Analysisin Compile time
Semantic Analysisin Compile time
Generated Codein Runtime
![Page 32: 40-414 Compiler Design Semantic Analysis Symbol Table](https://reader030.vdocuments.us/reader030/viewer/2022012620/61a0cafec49cd022a20e2eb6/html5/thumbnails/32.jpg)
32
Program S()Var a[1..5], c, realProcedure R(m: integer)
Var b[1..5] integerProcedure E()
Var I, c[1..3] integerc(3) := a (2) + b (1)
End EFunction Q(n: integer): integer
Var a integerProcedure P()
Var b realb := a + c
End PEnd Q
End REnd S
1234567891011121314151617
Question?
What is the state of symbol table and scope stack at the time of compiling lines 7 and 13?