Declarative Semantics Definition - Term Rewriting

142
Challenge the future Delft University of Technology Course IN4303 2013/14 Compiler Construction Guido Wachsmuth Declarative Semantics Definition Term Rewriting

description

Presentation slides for lecture 6 of course IN4303 on Compiler Construction at TU Delft.

Transcript of Declarative Semantics Definition - Term Rewriting

Page 1: Declarative Semantics Definition - Term Rewriting

Challenge the future

DelftUniversity ofTechnology

Course IN4303 2013/14Compiler Construction

Guido Wachsmuth

Declarative Semantics DefinitionTerm Rewriting

Page 2: Declarative Semantics Definition - Term Rewriting

today’s lecture

Term Rewriting

Overview

manual implementation

• static analysis & error checking

• code generation

• semantic editor services

domain-specific language

• Stratego

• transform ASTs

• working on ATerms

• declarative style

2

Page 3: Declarative Semantics Definition - Term Rewriting

Term Rewriting

overview

I

3

Page 4: Declarative Semantics Definition - Term Rewriting

architecture

Term Rewriting

Modern Compilers in IDEs

4

SourceCode

Page 5: Declarative Semantics Definition - Term Rewriting

architecture

Term Rewriting

Modern Compilers in IDEs

4

SourceCode

parse

Page 6: Declarative Semantics Definition - Term Rewriting

architecture

Term Rewriting

Modern Compilers in IDEs

4

SourceCode

parse

check

Page 7: Declarative Semantics Definition - Term Rewriting

architecture

Term Rewriting

Modern Compilers in IDEs

4

SourceCode

parse

check

Page 8: Declarative Semantics Definition - Term Rewriting

architecture

Term Rewriting

Modern Compilers in IDEs

4

SourceCode

parse generate

MachineCode

check

Page 9: Declarative Semantics Definition - Term Rewriting

manual implementation

Term Rewriting

Traditional Compiler Compilers

5

LanguageImplementation

compile

Compiler

Page 10: Declarative Semantics Definition - Term Rewriting

compilation + compilation

Term Rewriting

Traditional Compiler Compilers

6

LanguageImplementation

compile

CompilerLanguageDefinition

compile

Page 11: Declarative Semantics Definition - Term Rewriting

compilation + interpretation

Term Rewriting

Traditional Compiler Compilers

7

interpret

InterpreterLanguageDefinition

compile

LanguageImplementation

Page 12: Declarative Semantics Definition - Term Rewriting

compilation + interpretation

Term Rewriting

Spoofax Language Workbench

8

interpret

GenericParser

SyntaxDefinition

compile

Parse Table

Page 13: Declarative Semantics Definition - Term Rewriting

manual implementation

Term Rewriting

Spoofax Language Workbench

Stratego

• declarative DSL

• domain: program transformation

• means to manipulate ASTs

• working on ATerms

• compiles to C or Java

Stratego in Spoofax

• static analysis & error checking

• code generation

• semantic editor services

9

Page 14: Declarative Semantics Definition - Term Rewriting

concepts

Term Rewriting

Stratego

signatures

rewrite rules

• transform term to term

• left-hand side

• pattern matching & variable binding

• right-hand side

• pattern instantiation & variable substitution

rewrite strategies

• algorithm for applying rewrite rules

10

Page 15: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

module desugar

imports include/Tiger operators

strategies desugar-all = innermost(desugar)rules

desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal())

11

Page 16: Declarative Semantics Definition - Term Rewriting

Term Rewriting

signatures

II

12

Page 17: Declarative Semantics Definition - Term Rewriting

context-free syntax

"-" Exp -> Exp {cons("Uminus")} Exp "+" Exp -> Exp {cons("Plus")} Exp "-" Exp -> Exp {cons("Minus")} Exp "*" Exp -> Exp {cons("Times")} Exp "/" Exp -> Exp {cons("Divide")} Exp "=" Exp -> Exp {cons("Eq")} Exp "<>" Exp -> Exp {cons("Neq")} Exp ">" Exp -> Exp {cons("Gt")} Exp "<" Exp -> Exp {cons("Lt")} Exp ">=" Exp -> Exp {cons("Geq")} Exp "<=" Exp -> Exp {cons("Leq")} Exp "&" Exp -> Exp {cons("And")} Exp "|" Exp -> Exp {cons("Or")}

Term Rewriting

Signatures

signature constructors Uminus : Exp -> Exp Plus : Exp * Exp -> Exp Minus : Exp * Exp -> Exp Times : Exp * Exp -> Exp Divide : Exp * Exp -> Exp

Eq : Exp * Exp -> Exp Neq : Exp * Exp -> Exp Gt : Exp * Exp -> Exp Lt : Exp * Exp -> Exp Geq : Exp * Exp -> Exp Leq : Exp * Exp -> Exp

And : Exp * Exp -> Exp Or : Exp * Exp -> Exp

13

Page 18: Declarative Semantics Definition - Term Rewriting

signature

Term Rewriting

signature constructors Constructor : Cons -> Term Application : Cons * List(Term) -> Term List : List(Term) -> Term Tuple : List(Term) -> Term signature constructors Nil : -> List(a) Cons : a * List(a) -> List(a) Conc : List(a) * List(a) -> List(a)

14

ATerms in Stratego

Page 19: Declarative Semantics Definition - Term Rewriting

Term Rewriting

rewrite rules

III

15

Page 20: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Desugaring

if x then printint(x)

16

if x then printint(x) else ()

Page 21: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Desugaring

if x then printint(x)

16

if x then printint(x) else ()

IfThen( Var("x"), Call( "printint" , [Var("x")] ))

IfThenElse( Var("x"), Call( "printint" , [Var("x")] ), NoVal())

Page 22: Declarative Semantics Definition - Term Rewriting

desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal())

Term Rewriting

Desugaring

if x then printint(x)

16

if x then printint(x) else ()

IfThen( Var("x"), Call( "printint" , [Var("x")] ))

IfThenElse( Var("x"), Call( "printint" , [Var("x")] ), NoVal())

Page 23: Declarative Semantics Definition - Term Rewriting

desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal())

Term Rewriting

Desugaring

if x then printint(x)

16

if x then printint(x) else ()

IfThen( Var("x"), Call( "printint" , [Var("x")] ))

IfThenElse( Var("x"), Call( "printint" , [Var("x")] ), NoVal())pattern matching

Page 24: Declarative Semantics Definition - Term Rewriting

desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal())

Term Rewriting

Desugaring

if x then printint(x)

16

if x then printint(x) else ()

IfThen( Var("x"), Call( "printint" , [Var("x")] ))

IfThenElse( Var("x"), Call( "printint" , [Var("x")] ), NoVal())pattern matching

e1

e2

Page 25: Declarative Semantics Definition - Term Rewriting

desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal())

Term Rewriting

Desugaring

if x then printint(x)

16

if x then printint(x) else ()

IfThen( Var("x"), Call( "printint" , [Var("x")] ))

IfThenElse( Var("x"), Call( "printint" , [Var("x")] ), NoVal())pattern matching pattern instantiation

e1

e2

Page 26: Declarative Semantics Definition - Term Rewriting

desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal())

Term Rewriting

Desugaring

if x then printint(x)

16

if x then printint(x) else ()

IfThen( Var("x"), Call( "printint" , [Var("x")] ))

IfThenElse( Var("x"), Call( "printint" , [Var("x")] ), NoVal())pattern matching pattern instantiation

e1

e2

Page 27: Declarative Semantics Definition - Term Rewriting

desugar: Uminus(e) -> Bop(MINUS(), Int("0"), e)

desugar: Plus(e1, e2) -> Bop(PLUS(), e1, e2)desugar: Minus(e1, e2) -> Bop(MINUS(), e1, e2)desugar: Times(e1, e2) -> Bop(MUL(), e1, e2)desugar: Divide(e1, e2) -> Bop(DIV(), e1, e2)

desugar: Eq(e1, e2) -> Rop(EQ(), e1, e2)desugar: Neq(e1, e2) -> Rop(NE(), e1, e2)desugar: Leq(e1, e2) -> Rop(LE(), e1, e2)desugar: Lt(e1, e2) -> Rop(LT(), e1, e2)desugar: Geq(e1, e2) -> Rop(LE(), e2, e1)desugar: Gt(e1, e2) -> Rop(LT(), e2, e1)

desugar: And(e1, e2) -> IfThenElse(e1, e2, Int("0"))desugar: Or(e1, e2) -> IfThenElse(e1, Int("1"), e2)

Term Rewriting

More Desugaring

signature constructors PLUS: BinOp MINUS: BinOp MUL: BinOp DIV: BinOp EQ: RelOp NE: RelOp LE: RelOp LT: RelOp Bop: BinOp * Expr * Expr -> Expr Rop: RelOp * Expr * Expr -> Expr

17

Page 28: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Constant Folding

x := 21 + 21 + x

18

x := 42 + x

Page 29: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Constant Folding

x := 21 + 21 + x

18

x := 42 + x

Assign( Var("x"), Plus( Plus( Int("21") , Int("21") ) , Var("x") ))

Assign( Var("x"), Plus( Int("42") , Var("x") ))

Page 30: Declarative Semantics Definition - Term Rewriting

eval: Bop(PLUS(), Int(i1), Int(i2)) -> Int(i3) where <addS> (i1, i2) => i3

Term Rewriting

Constant Folding

x := 21 + 21 + x

18

x := 42 + x

Assign( Var("x"), Plus( Plus( Int("21") , Int("21") ) , Var("x") ))

Assign( Var("x"), Plus( Int("42") , Var("x") ))

Page 31: Declarative Semantics Definition - Term Rewriting

eval: Bop(PLUS(), Int(i1), Int(i2)) -> Int(<addS> (i1, i2))

eval: Bop(MINUS(), Int(i1), Int(i2)) -> Int(<subtS> (i1, i2))

eval: Bop(MUL(), Int(i1), Int(i2)) -> Int(<mulS> (i1, i2))

eval: Bop(DIV(), Int(i1), Int(i2)) -> Int(<divS> (i1, i2))eval: Rop(EQ(), Int(i), Int(i)) -> Int("1")eval: Rop(EQ(), Int(i1), Int(i2)) -> Int("0") where not( <eq> (i1, i2) )

eval: Rop(NE(), Int(i), Int(i)) -> Int("0")eval: Rop(NE(), Int(i1), Int(i2)) -> Int("1") where not( <eq> (i1, i2) )eval: Rop(LT(), Int(i1), Int(i2)) -> Int("1") where <ltS> (i1, i2)eval: Rop(LT(), Int(i1), Int(i2)) -> Int("0") where not( <ltS> (i1, i2) )eval: Rop(LE(), Int(i1), Int(i2)) -> Int("1") where <leqS> (i1, i2)eval: Rop(LE(), Int(i1), Int(i2)) -> Int("0") where not( <leqS> (i1, i2))

Term Rewriting

More Constant Folding

19

Page 32: Declarative Semantics Definition - Term Rewriting

parameters

Term Rewriting

Rewrite Rules

f(x,y|a,b): lhs -> rhs

• strategy or rule parameters x,y

• term parameters a,b

• no matching

f(|a,b): lhs -> rhs

• optional strategy parameters

f(x,y): lhs -> rhs

• optional term parameters

f: lhs -> rhs

20

Page 33: Declarative Semantics Definition - Term Rewriting

example: map

Term Rewriting

Rules with Parameters

21

[ 1, 2, 3]

[ 2, 3, 4]

map(inc)

Page 34: Declarative Semantics Definition - Term Rewriting

example: map

Term Rewriting

Rules with Parameters

21

[ 1, 2, 3]

[ 2, 3, 4]

map(inc)

inc

1

2

3

2

3

4inc

inc

Page 35: Declarative Semantics Definition - Term Rewriting

example: map

Term Rewriting

Rules with Parameters

map(s): [] -> []map(s): [x|xs] -> [<s> x | <map(s)> xs]

21

[ 1, 2, 3]

[ 2, 3, 4]

map(inc)

inc

1

2

3

2

3

4inc

inc

Page 36: Declarative Semantics Definition - Term Rewriting

example: zip

Term Rewriting

Rules with Parameters

22

[ 1, 2, 3]

[ (1,4), (2,5), (3,6)]

[ 4, 5, 6]zip

Page 37: Declarative Semantics Definition - Term Rewriting

example: zip

Term Rewriting

Rules with Parameters

22

[ 1, 2, 3]

[ (1,4), (2,5), (3,6)]

[ 4, 5, 6]zip

[ 1, 2, 3]

[ 5, 7, 9]

[ 4, 5, 6]zip(add)

Page 38: Declarative Semantics Definition - Term Rewriting

example: zip

Term Rewriting

Rules with Parameters

22

[ 1, 2, 3]

[ (1,4), (2,5), (3,6)]

[ 4, 5, 6]zip

[ 1, 2, 3]

[ 5, 7, 9]

[ 4, 5, 6]zip(add)

map(add)

Page 39: Declarative Semantics Definition - Term Rewriting

example: zip

Term Rewriting

Rules with Parameters

zip(s): ([],[]) -> []zip(s): ([x|xs],[y|ys]) -> [<s> (x,y) | <zip(s)> (xs,ys)]

zip = zip(id)

22

[ 1, 2, 3]

[ (1,4), (2,5), (3,6)]

[ 4, 5, 6]zip

[ 1, 2, 3]

[ 5, 7, 9]

[ 4, 5, 6]zip(add)

map(add)

Page 40: Declarative Semantics Definition - Term Rewriting

example: fold

Term Rewriting

Rules with Parameters

23

[1,2,3] foldr(!0,add) 6

Page 41: Declarative Semantics Definition - Term Rewriting

example: fold

Term Rewriting

Rules with Parameters

23

[1,2,3] foldr(!0,add) 6

[]

0

[3]

3

[2,3]

56

[1,2,3]

Page 42: Declarative Semantics Definition - Term Rewriting

example: fold

Term Rewriting

Rules with Parameters

foldr(s1,s2): [] -> <s1>foldr(s1,s2): [x|xs] -> <s2> (x,<foldr(s1,s2)> xs)

23

[1,2,3] foldr(!0,add) 6

[]

0

[3]

3

[2,3]

56

[1,2,3]

Page 43: Declarative Semantics Definition - Term Rewriting

example: inverse

Term Rewriting

Rules with Parameters

24

[1,2,3] inverse(|[]) [3,2,1]

Page 44: Declarative Semantics Definition - Term Rewriting

example: inverse

Term Rewriting

Rules with Parameters

24

[1,2,3] inverse(|[]) [3,2,1]

[2,3]

[1][]

[1,2,3] [3]

[2,1] [3,2,1]

[]

Page 45: Declarative Semantics Definition - Term Rewriting

example: inverse

Term Rewriting

Rules with Parameters

inverse(|is): [] -> isinverse(|is): [x|xs] -> <inverse(|[x|is])> xs

24

[1,2,3] inverse(|[]) [3,2,1]

[2,3]

[1][]

[1,2,3] [3]

[2,1] [3,2,1]

[]

Page 46: Declarative Semantics Definition - Term Rewriting

Term Rewriting 25

coffee break

Page 47: Declarative Semantics Definition - Term Rewriting

Term Rewriting

rewrite strategies

IV

26

Page 48: Declarative Semantics Definition - Term Rewriting

rules and strategies

Term Rewriting

Transformation Definitions

rewrite rules

• term to term

• left-hand side matching

• right-hand side instantiation

• conditional

• partial transformation

rewrite strategies

• rule selection

• algorithm

• composition of transformations

27

Page 49: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

module desugar

imports include/Tiger operators

strategies desugar-all = innermost(desugar)rules

desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal())

28

Page 50: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

module eval

imports include/Tiger operators desugar

strategies

eval-all = innermost(desugar + eval)rules eval: Bop(PLUS(),Int(i1),Int(i2)) -> Int(i3) where <addS> (i1, i2) => i3

29

Page 51: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Strategy Combinators

identity

id

30

Page 52: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Strategy Combinators

identity

id

failure

fail

30

Page 53: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Strategy Combinators

identity

id

failure

fail

sequential composition

s1 ; s2

30

Page 54: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Strategy Combinators

identity

id

failure

fail

sequential composition

s1 ; s2

deterministic choice

s1 <+ s2

30

Page 55: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Strategy Combinators

identity

id

failure

fail

sequential composition

s1 ; s2

deterministic choice

s1 <+ s2

non-deterministic choice

s1 + s2

30

Page 56: Declarative Semantics Definition - Term Rewriting

Term Rewriting

Strategy Combinators

identity

id

failure

fail

sequential composition

s1 ; s2

deterministic choice

s1 <+ s2

non-deterministic choice

s1 + s2

guarded choice

s1 < s2 + s3

30

Page 57: Declarative Semantics Definition - Term Rewriting

variables

Term Rewriting

Strategy Combinators

pattern matching

?t

31

Page 58: Declarative Semantics Definition - Term Rewriting

variables

Term Rewriting

Strategy Combinators

pattern matching

?t

pattern instantiation

!t

31

Page 59: Declarative Semantics Definition - Term Rewriting

variables

Term Rewriting

Strategy Combinators

pattern matching

?t

pattern instantiation

!t

strategy application

<s> t ≣ !t ; s

31

Page 60: Declarative Semantics Definition - Term Rewriting

variables

Term Rewriting

Strategy Combinators

pattern matching

?t

pattern instantiation

!t

strategy application

<s> t ≣ !t ; s

result matching

s => t ≣ s ; ?t <s> t1 => t2t2 := <s> t1

31

Page 61: Declarative Semantics Definition - Term Rewriting

variables

Term Rewriting

Strategy Combinators

pattern matching

?t

pattern instantiation

!t

strategy application

<s> t ≣ !t ; s

result matching

s => t ≣ s ; ?t <s> t1 => t2t2 := <s> t1

variable scope

{x,y: s}

31

Page 62: Declarative Semantics Definition - Term Rewriting

rules and strategies

Term Rewriting

Strategy Combinators

named rewrite rule

l: t1 -> t2 where s ≣ l = ?t1 ; s ; !t2

32

Page 63: Declarative Semantics Definition - Term Rewriting

rules and strategies

Term Rewriting

Strategy Combinators

named rewrite rule

l: t1 -> t2 where s ≣ l = ?t1 ; s ; !t2

unscoped rewrite rule

(t1 -> t2 where s) ≣ ?t1 ; s ; !t2

32

Page 64: Declarative Semantics Definition - Term Rewriting

rules and strategies

Term Rewriting

Strategy Combinators

named rewrite rule

l: t1 -> t2 where s ≣ l = ?t1 ; s ; !t2

unscoped rewrite rule

(t1 -> t2 where s) ≣ ?t1 ; s ; !t2

strategy definition

f(x,y|a,b) = s

32

Page 65: Declarative Semantics Definition - Term Rewriting

examples

Term Rewriting

Strategy Combinators

try(s) = s <+ id

repeat(s) = try(s ; repeat(s))

33

Page 66: Declarative Semantics Definition - Term Rewriting

examples

Term Rewriting

Strategy Combinators

try(s) = s <+ id

repeat(s) = try(s ; repeat(s))

topdown(s) = s ; all(topdown(s))

33

Page 67: Declarative Semantics Definition - Term Rewriting

examples

Term Rewriting

Strategy Combinators

try(s) = s <+ id

repeat(s) = try(s ; repeat(s))

topdown(s) = s ; all(topdown(s))

alltd(s) = s <+ all(alltd(s))

33

Page 68: Declarative Semantics Definition - Term Rewriting

examples

Term Rewriting

Strategy Combinators

try(s) = s <+ id

repeat(s) = try(s ; repeat(s))

topdown(s) = s ; all(topdown(s))

alltd(s) = s <+ all(alltd(s))

bottomup(s) = all(bottomup(s)) ; s

innermost(s) = bottomup(try(s ; innermost(s)))

oncetd(s) = s <+ one(oncetd(s))

contains(|t) = oncetd(?t)

33

Page 69: Declarative Semantics Definition - Term Rewriting

examples

Term Rewriting

Strategy Combinators

try(s) = s <+ id

repeat(s) = try(s ; repeat(s))

topdown(s) = s ; all(topdown(s))

alltd(s) = s <+ all(alltd(s))

bottomup(s) = all(bottomup(s)) ; s

innermost(s) = bottomup(try(s ; innermost(s)))

oncetd(s) = s <+ one(oncetd(s))

contains(|t) = oncetd(?t)

33

Page 70: Declarative Semantics Definition - Term Rewriting

examples

Term Rewriting

Strategy Combinators

try(s) = s <+ id

repeat(s) = try(s ; repeat(s))

topdown(s) = s ; all(topdown(s))

alltd(s) = s <+ all(alltd(s))

bottomup(s) = all(bottomup(s)) ; s

innermost(s) = bottomup(try(s ; innermost(s)))

oncetd(s) = s <+ one(oncetd(s))

contains(|t) = oncetd(?t)

33

Page 71: Declarative Semantics Definition - Term Rewriting

examples

Term Rewriting

Strategy Combinators

try(s) = s <+ id

repeat(s) = try(s ; repeat(s))

topdown(s) = s ; all(topdown(s))

alltd(s) = s <+ all(alltd(s))

bottomup(s) = all(bottomup(s)) ; s

innermost(s) = bottomup(try(s ; innermost(s)))

oncetd(s) = s <+ one(oncetd(s))

contains(|t) = oncetd(?t)

33

Page 72: Declarative Semantics Definition - Term Rewriting

examples

Term Rewriting

Strategy Combinators

try(s) = s <+ id

repeat(s) = try(s ; repeat(s))

topdown(s) = s ; all(topdown(s))

alltd(s) = s <+ all(alltd(s))

bottomup(s) = all(bottomup(s)) ; s

innermost(s) = bottomup(try(s ; innermost(s)))

oncetd(s) = s <+ one(oncetd(s))

contains(|t) = oncetd(?t)

33

Page 73: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(switch)

34

Const

Mul

Const

3 4 5

Const

Add

Page 74: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(switch)

34

Const

Mul

Const

3 4 5

Const

Add1

Page 75: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(switch)

35

Mul

Const

3

Const

4 5

Const

Add1

Page 76: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(switch)

35

Mul

Const

3

Const

4 5

Const

Add1

2

Page 77: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(switch)

36

Mul

Const

3

Const

5 4

Const

Add1

2

Page 78: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(switch)

36

Mul

Const

3

Const

5 4

Const

Add1

2

3

Page 79: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

37

Const

Mul

Const

3 4 5

Const

Add

Page 80: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

37

Const

Mul

Const

3 4 5

Const

Add1

Page 81: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

38

Mul

Const

3

Const

4 5

Const

Add1

Page 82: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

38

Mul

Const

3

Const

4 5

Const

Add1

2

Page 83: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

39

Mul

Const

3

Const

5 4

Const

Add1

2

Page 84: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

39

Mul

Const

3

Const

5 4

Const

Add1

2

3

Page 85: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

39

Mul

Const

3

Const

5 4

Const

Add1

2

3

4

Page 86: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

39

Mul

Const

3

Const

5 4

Const

Add1

2

3

4

5

Page 87: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

39

Mul

Const

3

Const

5 4

Const

Add1

2

3

4

5

6

Page 88: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

39

Mul

Const

3

Const

5 4

Const

Add1

2

3

4

5

6

7

Page 89: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

topdown(s) = s ; all(topdown(s))

topdown(try(switch))

39

Mul

Const

3

Const

5 4

Const

Add1

2

3

4

5

6

7

8

Page 90: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

40

Const

Mul

Const

3 4 5

Const

Add

Page 91: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

40

Const

Mul

Const

3 4 5

Const

Add1

Page 92: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

41

Mul

Const

3

Const

4 5

Const

Add1

Page 93: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

42

Const

Mul

Const

3 4 5

Const

Add

Page 94: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

42

Const

Mul

Const

3 4 5

Const

Add1

Page 95: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

42

Const

Mul

Const

3 4 5

Const

Add1

2

Page 96: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

42

Const

Mul

Const

3 4 5

Const

Add1

2

3

Page 97: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

42

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

Page 98: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Mul(e1, e2) -> Mul(e2, e1)

alltd(s) = s <+ all(alltd(s))

alltd(switch)

43

Const

Mul

Const

3 5 4

Const

Add1

2

3

4

Page 99: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(switch)

44

Const

Mul

Const

3 4 5

Const

Add

Page 100: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(switch)

44

Const

Mul

Const

3 4 5

Const

Add1

Page 101: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(switch)

44

Const

Mul

Const

3 4 5

Const

Add1

2

Page 102: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(switch)

44

Const

Mul

Const

3 4 5

Const

Add1

2

3

Page 103: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add

Page 104: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add1

Page 105: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add1

2

Page 106: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add1

2

3

Page 107: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

Page 108: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

5

Page 109: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

5

6

Page 110: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

5

6

7

Page 111: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

45

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

5

6

7

8

Page 112: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

46

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

Page 113: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

47

Const

Mul

Const

3 5 4

Const

Add1

2

3

4

Page 114: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

48

Const

Mul

Const

3 5 4

Const

Add1

Page 115: Declarative Semantics Definition - Term Rewriting

Mul

Const

3

Const

5 4

Const

Add

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

bottomup(s) = all(bottomup(s)) ; s

bottomup(try(switch))

49

1

Page 116: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add

Page 117: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add1

Page 118: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add1

2

Page 119: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add1

2

3

Page 120: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

Page 121: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

5

Page 122: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

5

6

Page 123: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

5

6

7

Page 124: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

50

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

5

6

7

8

Page 125: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

51

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

Page 126: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

52

Const

Mul

Const

3 5 4

Const

Add1

2

3

4

Page 127: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

52

Const

Mul

Const

3 5 4

Const

Add1

2

3

4

9

Page 128: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

52

Const

Mul

Const

3 5 4

Const

Add1

2

3

4

9

10

Page 129: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

52

Const

Mul

Const

3 5 4

Const

Add1

2

3

4

9

10

11

Page 130: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

52

Const

Mul

Const

3 5 4

Const

Add1

2

3

4

9

10

11

12

Page 131: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

53

Const

Mul

Const

3 5 4

Const

Add1

2

3

4

Page 132: Declarative Semantics Definition - Term Rewriting

example

Term Rewriting

Stratego

switch: Add(e1, e2) -> Add(e2, e1)switch: Mul(e1, e2) -> Mul(e2, e1)

innermost(s) = bottomup(try(s ; innermost(s)))

innermost(switch)

54

Const

Mul

Const

3 4 5

Const

Add1

2

3

4

Page 133: Declarative Semantics Definition - Term Rewriting

Term Rewriting

summary

V

55

Page 134: Declarative Semantics Definition - Term Rewriting

lessons learned

Term Rewriting

Summary

56

Page 135: Declarative Semantics Definition - Term Rewriting

lessons learned

Term Rewriting

Summary

How do you define AST transformations in Stratego?

• signatures

• rewrite rules

• rewrite strategies

• strategy combinators

56

Page 136: Declarative Semantics Definition - Term Rewriting

lessons learned

Term Rewriting

Summary

How do you define AST transformations in Stratego?

• signatures

• rewrite rules

• rewrite strategies

• strategy combinators

What kind of strategies can you find in the Stratego library?

• arithmetics

• map, zip, foldr

• generic traversals

56

Page 137: Declarative Semantics Definition - Term Rewriting

learn more

Term Rewriting

Literature

57

Page 138: Declarative Semantics Definition - Term Rewriting

learn more

Term Rewriting

Literature

Spoofax

Lennart C. L. Kats, Eelco Visser: The Spoofax Language Workbench. Rules for Declarative Specification of Languages and IDEs. OOPSLA 2010

http://www.spoofax.org

57

Page 139: Declarative Semantics Definition - Term Rewriting

learn more

Term Rewriting

Literature

Spoofax

Lennart C. L. Kats, Eelco Visser: The Spoofax Language Workbench. Rules for Declarative Specification of Languages and IDEs. OOPSLA 2010

http://www.spoofax.org

Stratego

Martin Bravenboer, Karl Trygve Kalleberg, Rob Vermaas, Eelco Visser: Stratego/XT 0.17. A language and toolset for program transformation. Science of Computer Programming, 72(1-2), 2008.

http://www.strategoxt.org

57

Page 140: Declarative Semantics Definition - Term Rewriting

coming next

Term Rewriting

Outlook

declarative semantics definition

• Lecture 5: Static Analysis and Error Checking

• Lecture 6: Code Generation

Assignment Oct 2: MiniJava grammar in SDF

• submit on Blackboard

Lab Oct 03

• syntactic editor services

• pretty-printer for MiniJava

58

Page 142: Declarative Semantics Definition - Term Rewriting

attribution & copyrights

Term Rewriting

Pictures

Slides 1, 9, 10, 20, 27: Stratego by Kendrick Arnett, some rights reserved

Slides 23-26, 28, 31, 37-39, 41-43: PICOL icons by Melih Bilgil, some rights reserved

Slide 14: Thesaurus by Enoch Lau, some rights reserved

Slide 21: Google Maps Street View Camera by Ian Britton, some rights reserved

Slide 22: Zipper by Rabensteiner, some rights reserved

Slide 23: Fold by Kim Piper Werker, some rights reserved

Slide 24: Inverse by lanchongzi, some rights reserved

Slide 25: Maxwell's by Dominica Williamson, some rights reserved

Slide 58: Reichstag by Wolfgang Staudt, some rights reserved

60