11. Static Analysis and Error Checking 4
static checking
name analysis
name binding and scope
12. Static Analysis and Error Checking 4
static checking
editor services
name analysis
name binding and scope
13. Static Analysis and Error Checking 4
static checking
editor services
transformation
name analysis
name binding and scope
14. Static Analysis and Error Checking 4
static checking
editor services
transformation
refactoring
name analysis
name binding and scope
15. Static Analysis and Error Checking 4
static checking
editor services
transformation
refactoring
code generation
name analysis
name binding and scope
16. SDF3
NaBL
TS
Stratego
ESV
editor
Static Analysis and Error Checking
SPT
tests
5
syntax definition
concrete syntax
abstract syntax
static semantics
name binding
type system
dynamic semantics
translation
interpretation
17. SDF3
NaBL
TS
Stratego
ESV
editor
Static Analysis and Error Checking
SPT
tests
6
syntax definition
concrete syntax
abstract syntax
static semantics
name binding
type system
dynamic semantics
translation
interpretation
18. Static Analysis and Error Checking 7
formal semantics
type system
name binding
testing
name binding
type system
constraints
specification
name binding
type system
constraints
27. /* factorial function */
!
let
!
var x := 0
!
function fact(n : int) : int =
if n < 1 then 1 else (n * fact(n - 1))
!
in
!
for i := 1 to 3 do (
x := x + fact(i);
printint(x);
print(" ")
)
!
end
Static Analysis and Error Checking 11
28. #include <stio.h>
!
/* factorial function */
!
int fac(int num) {
if (num < 1)
Static Analysis and Error Checking 12
return 1;
else
return num * fac(num - 1);
}
!
int main() {
printf(“%d! = %dn”, 10, fac(10));
return 0;
}
29. class Main {
!
public static void main(String[] args) {
System.out.println(new Fac().fac(10));
}
}
!
class Fac {
!
public int fac(int num) {
int num_aux;
if (num < 1)
num_aux = 1;
else
num_aux = num * this.fac(num - 1);
return num_aux;
}
}
Static Analysis and Error Checking 13
30. Static Analysis and Error Checking 14
static semantics
restricting context-free languages
context-sensitive
language
context-free grammar
L(G) = {w∈Σ* | S ⇒G* w}
31. restricting context-free languages
Static Analysis and Error Checking 14
static semantics
context-free superset
context-sensitive
language
context-free grammar
L(G) = {w∈Σ* | S ⇒G* w}
32. restricting context-free languages
Static Analysis and Error Checking 14
static semantics
context-free superset
context-sensitive
language
context-free grammar
L(G) = {w∈Σ* | S ⇒G* w}
33. restricting context-free languages
Static Analysis and Error Checking 14
static semantics
context-free superset
context-sensitive
language
context-free grammar
L(G) = {w∈Σ* | S ⇒G* w}
static semantics
L = {w∈ L(G) | ⊢ w}
34. restricting context-free languages
Static Analysis and Error Checking 14
static semantics
context-free superset
context-sensitive
language
context-free grammar
L(G) = {w∈Σ* | S ⇒G* w}
static semantics
L = {w∈ L(G) | ⊢ w}
judgements
well-formed ⊢ w
well-typed E ⊢ e : t
35. restricting context-free languages
Static Analysis and Error Checking 14
static semantics
context-free superset
context-sensitive
language
context-free grammar
L(G) = {w∈Σ* | S ⇒G* w}
static semantics
L = {w∈ L(G) | ⊢ w}
judgements
well-formed ⊢ w
well-typed E ⊢ e : t
37. Tiger
type system
Static Analysis and Error Checking 16
E ⊢ i : int
E ⊢ s : string
E ⊢ nil : ⊥
38. Tiger
type system
Static Analysis and Error Checking 17
E ⊢ () : ∅
E ⊢ e1 : t1
E ⊢ e2 : t2
E ⊢ e1 ; e2 : t2
39. Tiger
type system
E ⊢ e1 : array of t
E ⊢ e2 : int
E ⊢ e1[e2] : t
Static Analysis and Error Checking 18
E ⊢ e1 : int
E ⊢ e2 : int
E ⊢ e1 + e2 : int
E ⊢ e1 : int
E ⊢ e2 : int
E ⊢ e1 < e2 : int
E ⊢ e1 : string
E ⊢ e2 : string
E ⊢ e1 < e2 : int
40. Tiger
type system
E ⊢ e1 : t1
E ⊢ e2 : t2
t1 ≅ t2
E ⊢ e1 = e2 : int
t1 <: t2
t1 ≅ t2
t2 <: t1
t1 ≅ t2
t ≠ ∅
t ≅ t
Static Analysis and Error Checking 19
⊥<: {f1, …, fn}
⊥<: array of t
41. Tiger
type system
Static Analysis and Error Checking 20
E ⊢ e1 : t1
E ⊢ e2 : t2
t1 ≅ t2
E ⊢ e1 := e2 : ∅
E ⊢ e1 : int
E ⊢ e2 : t1
E ⊢ e3 : t2
E ⊢ if e1 then e2 else e3: sup<: {t1, t2}
43. Tiger
scoping
Static Analysis and Error Checking 22
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
44. Tiger
scoping
Static Analysis and Error Checking 22
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
45. Tiger
scoping
Static Analysis and Error Checking 22
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
46. Tiger
scoping
Static Analysis and Error Checking 22
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
47. Tiger
scoping
Static Analysis and Error Checking 22
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
48. Tiger
variable names
E ⊢ e1 : t1
t ≅ t1
E ⊕ v ↦ t ⊢ e2 : t2
E ⊢ let var v : t = e1 in e2: t2
Static Analysis and Error Checking 23
E(v) = t
E ⊢ v : t
49. Tiger
function names
E ⊕ v1 ↦ t1 ,…, vn ↦ tn ⊢ e1 : tf
E ⊕ f ↦ t1 × … × tn → tf ⊢ e2 : t
E ⊢ let
function f (v1 : t1, …, vn : tn) = e1
in e2: t
E(f) = t1 × … × tn → tf
e1 : t1
…
en : tn
E ⊢ f (e1, …, en) : t
Static Analysis and Error Checking 24
51. Static Analysis and Error Checking 26
test outer name [[
let type t = u
Testing
name binding
type [[u]] = int
var x: [[u]] := 0
in
x := 42 ;
let type u = t
var y: u := 0
in
y := 42
end
end
]] resolve #2 to #1
test inner name [[
let type t = u
type u = int
var x: u := 0
in
x := 42 ;
let type [[u]] = t
var y: [[u]] := 0
in
y := 42
end
end
]] resolve #2 to #1
52. Static Analysis and Error Checking 27
test integer constant [[
let type t = u
type u = int
var x: u := 0
in
x := 42 ;
let type u = t
var y: u := 0
in
y := [[42]]
end
Testing
type system
end
]] run get-type to IntTy()
test variable reference [[
let type t = u
type u = int
var x: u := 0
in
x := 42 ;
let type u = t
var y: u := 0
in
y := [[x]]
end
end
]] run get-type to IntTy()
53. Static Analysis and Error Checking 28
Testing
constraints
test undefined variable [[
let type t = u
type u = int
var x: u := 0
in
x := 42 ;
let type u = t
var y: u := 0
in
y := [[z]]
end
end
]] 1 error
test type error [[
let type t = u
type u = string
var x: u := 0
in
x := 42 ;
let type u = t
var y: u := 0
in
y := [[x]]
end
end
]] 1 error
54. Static Analysis and Error Checking 29
testing
static semantics
context-free superset
language
56. Name Binding Language
Static Analysis and Error Checking 31
concepts
defines
!
refers
!
namespaces
!
scopes
!
imports
57. Name Binding Language
definitions and references
Static Analysis and Error Checking 32
TypeDec(t, _):
defines Type t
Tid(t) :
refers to Type t
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
58. Name Binding Language
Static Analysis and Error Checking 33
unique definitions
TypeDec(t, _):
defines unique Type t
Tid(t) :
refers to Type t
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
59. Name Binding Language
Static Analysis and Error Checking 34
namespaces
let
type mt = int
type rt = {f1: string, f2: int}
type at = array of int
!
var x := 42
var y: int := 42
!
function p() = print("foo")
function sqr(x: int): int = x*x
in
…
end
namespaces
Type Variable Function
!
TypeDec(t, _):
defines unique Type t
!
FunDec(f, _, _):
defines unique Function f
FunDec(f, _, _, _):
defines unique Function f
Call(f, _) :
refers to Function f
!
VarDec(v, _):
defines unique Variable v
FArg(a, _):
defines unique Variable a
Var(v):
refers to Variable v
60. Name Binding Language
Static Analysis and Error Checking 35
scopes
FunDec(f, _, _):
defines unique Function f
scopes Variable
!
FunDec(f, _, _, _):
defines unique Function f
scopes Variable
Let(_, _):
scopes Type, Function, Variable
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
61. Name Binding Language
Static Analysis and Error Checking 35
scopes
FunDec(f, _, _):
defines unique Function f
scopes Variable
!
FunDec(f, _, _, _):
defines unique Function f
scopes Variable
Let(_, _):
scopes Type, Function, Variable
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
62. Name Binding Language
Static Analysis and Error Checking 35
scopes
FunDec(f, _, _):
defines unique Function f
scopes Variable
!
FunDec(f, _, _, _):
defines unique Function f
scopes Variable
Let(_, _):
scopes Type, Function, Variable
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
63. Name Binding Language
Static Analysis and Error Checking 35
scopes
FunDec(f, _, _):
defines unique Function f
scopes Variable
!
FunDec(f, _, _, _):
defines unique Function f
scopes Variable
Let(_, _):
scopes Type, Function, Variable
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
64. Name Binding Language
Static Analysis and Error Checking 35
scopes
FunDec(f, _, _):
defines unique Function f
scopes Variable
!
FunDec(f, _, _, _):
defines unique Function f
scopes Variable
Let(_, _):
scopes Type, Function, Variable
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
65. Name Binding Language
Static Analysis and Error Checking 36
definition scopes
For(v, start, end, body): for x := 0 to 42 do x;
defines Variable v in body
66. Static Analysis and Error Checking 37
Spoofax
bound renaming
let
type t = u
type u = int
var x: u := 0
in
x := 42 ;
let
type u = t
var y: u := 0
in
y := 42
end
end
let
type t0 = u0
type u0 = int
var x: u0 := 0
in
x := 42 ;
let
type u1 = t0
var y: u1 := 0
in
y := 42
end
end
67. Static Analysis and Error Checking 38
Spoofax
annotated terms
t{t1, ..., tn}
!
!
!
add additional information to a term but preserve its signature
69. Static Analysis and Error Checking 40
TS
axioms
type rules
!
Int(_) : IntTy()
String(_): StringTy()
!
signatures
!
NilTy: Type
type rules
!
Nil(): NilTy()
E ⊢ i : int
E ⊢ s : string
E ⊢ nil : ⊥
70. Static Analysis and Error Checking 41
TS
inference rules
type rules
!
Add(e1,e2): IntTy()
where e1: ty1
and ty1 == IntTy()
and e2: ty2
and ty2 == IntTy()
E ⊢ e1 : int
E ⊢ e2 : int
E ⊢ e1 + e2 : int
71. Static Analysis and Error Checking 42
TS
inference rules
type rules
!
Lt(e1,e2): IntTy()
where e1: ty1
and e2: ty2
and ( ( ty1 == IntTy() and ty2 == IntTy() )
or ( ty1 == StringTy() and ty2 == StringTy() )
)
E ⊢ e1 : int
E ⊢ e2 : int
E ⊢ e1 < e2 : int
E ⊢ e1 : string
E ⊢ e2 : string
E ⊢ e1 < e2 : int
72. defines unique Variable x
of type ty
Static Analysis and Error Checking 43
NaBL and TS
interaction
binding rules
!
VarDec(x, ty):
type rules
!
Var(x): ty
where definition of x: ty
73. Static Analysis and Error Checking 44
NaBL and TS
interaction
FArg(a, t):
defines unique Variable a of type t
!
FunDec(f, a*, e):
defines unique Function f of type (t*, t)
where a* has type t*
and e has type t
!
Call(f, a*) :
refers to Function f of type (t*, _)
where a* has type t*
75. Static Analysis and Error Checking 46
TS
type errors
type rules
!
Add(e1,e2): IntTy()
where e1: ty1
and ty1 == IntTy()
else error "…" on e1
and e2: ty2
and ty2 == IntTy()
else error "…" on e2
E ⊢ e1 : int
E ⊢ e2 : int
E ⊢ e1 + e2 : int
76. Static Analysis and Error Checking 47
TS
missing definitions
type rules
!
Var(x): ty
where definition of x: ty
else error "…" on x
77. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
78. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
79. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
80. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
81. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
82. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
83. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
84. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
85. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
86. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
87. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
88. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
89. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
90. Static Analysis and Error Che4c8king 48
Spoofax
origin tracking
let var x := 21 in y * 2 end
Let([VarDec("x", Int("21"))], [Times(Var("y"), Int("2"))])
desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)
Let([VarDec("x", Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Let([VarDec("x"{"…"}, Int("21"))], [Bop(MUL(), Var("y"), Int("2"))])
Var(x): ty
where definition of x: ty
else error "…" on x
91. Static Analysis and Error Checking 49
derivation of editor services
error checking
reference resolution
code completion
Spoofax
static analysis
95. Except where otherwise noted, this work is licensed under
Static Analysis and Error Checking 50
96. Static Analysis and Error Checking 51
attribution
slide title author license
1 Inspection Kent Wien CC BY-NC 2.0
2, 3 PICOL icons Melih Bilgil CC BY 3.0
10 Noam Chomsky Maria Castelló Solbes CC BY-NC-SA 2.0
11, 16-20, 22-24 Tiger Bernard Landgraf CC BY-SA 3.0
12 The C Programming Language Bill Bradford CC BY 2.0
13 Italian Java book cover
Notas do Editor
\n
\n
\n
feedback loop\n
feedback loop\n
feedback loop\n
feedback loop\n
feedback loop\n
restrictions on production rules => grammar classes\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
round-up on every lecture\n\nwhat to take with you\n\ncheck yourself, pre- and post-paration\n