SlideShare a Scribd company logo
Eelco Visser
CS4200 Compiler Construction
TU Delft
September 2019
Lecture 5: Transformation by Term Rewriting
Channel on research group Slack
Where many Spoofax users hang out
Ask questions about Spoofax
(Not answers to assignments)
No guarantee to quick response, or answer at all
Send me an email if you want an invitation
!2
#spoofax-users
This Lecture
!3
Source
Code
Editor
Parse
Abstract
Syntax
Tree
Transform
Abstract
Syntax
Tree
Define transformations on abstract syntax trees (terms) using rewrite rules
Reading Material
4
The following papers add background, conceptual exposition,
and examples to the material from the slides. Some notation and
technical details have been changed; check the documentation.
!5
Term rewrite rules define transformations on (abstract syntax)
trees. Traditional rewrite systems apply rules exhaustively. This
paper introduces programmable rewriting strategies to control
the application of rules, the core of the design of the Stratego
transformation language.

Note that the notation for contextual rules is no longer
supported by Stratego. However, the technique to implement
contextual rules still applies.
https://doi.org/10.1145/291251.289425
ICFP 1998
!6
Stratego/XT combines SDF2 and Stratego into toolset for
program transformation.

This paper gives a high-level overview of the concepts.

The StrategoXT.jar is still part of the Spoofax distribution.
https://doi.org/10.1007/978-3-540-25935-0_13
Lecture Notes in Computer Science 2003
!7
Spoofax combines SDF2 and Stratego into a language
workbench, i.e. an IDE for creating language definition from
which IDEs for the defined languages can be generated.

A distinctive feature of Spoofax is live language development,
which supports developing a language definition and programs
in the defined language in the same IDE instance. 

Spoofax was developed for Eclipse, which is still the main
development platform. However, Spoofax Core is now
independent of any IDE.
https://doi.org/10.1145/1932682.1869497
OOPSLA 2010
Note that the since the publication of this paper, we have
introduced more declarative approaches to name and type
analysis, which will be the topic of the next lectures.
!8
Documentation for Stratego at
the metaborg.org website.
http://www.metaborg.org/en/latest/source/langdev/meta/lang/stratego/index.html
!9
This paper defines the formal semantics of the full Stratego
language, including its scoped dynamic rules feature.
If you want to dig deeper
These slides document most features of the base language
without dynamic rules and without giving the formal
semantics.
Transformation Architecture
10
This presentation uses the Stratego Shell for explaining the behavior of
Stratego programs. The Stratego Shell is currently not supported by Spoofax
!11
!12
!13
!14
!15
!16
!17
!18
!19
Terms
20
Parsing: From Text to Terms
!21
Let(
[ FunDec(
"fact"
, [FArg("n", Tp(Tid("int")))]
, Tp(Tid("int"))
, If(
Lt(Var("n"), Int("1"))
, Int("1")
, Seq(
[ Times(
Var("n")
, Call(
Var("fact")
, [Minus(Var("n"), Int("1"))]
)
)
]
)
)
)
]
, [Call(Var("fact"), [Int("10")])]
)
let function fact(n : int) : int =
if n < 1 then 1 else (n * fact(n - 1))
in fact(10)
end
Syntax of Terms
!22
module Terms
sorts Cons Term
lexical syntax
Cons = [a-zA-Z][a-zA-Z0-9]*
context-free syntax
Term.App = <<Cons>(<{Term ","}*>)>
Zero()
Succ(Zero())
Cons(A(), Cons(B(), Nil()))
Syntax of Terms
!23
module Terms
sorts Cons Term
lexical syntax
Cons = [a-zA-Z][a-zA-Z0-9]*
context-free syntax
Term.App = <<Cons>(<{Term ","}*>)>
Term.List = <[<{Term ","}*>]>
Term.Tuple = <(<{Term ","}*>)>
Zero()
Succ(Zero())
[A(), B()]
module ATerms
sorts Cons Term
lexical syntax
Cons = [a-zA-Z][a-zA-Z0-9]*
Cons = String
Int = [0-9]+
String = """ StringChar* """
StringChar = ~["n]
StringChar = "" ["]
context-free syntax
Term.Str = <<String>>
Term.Int = <<Int>>
Term.App = <<Cons>(<{Term ","}*>)>
Term.List = <[<{Term ","}*>]>
Term.Tuple = <(<{Term ","}*>)>
Syntax of Terms
!24
0
1
[A(), B()]
Var(“x”)
Let(
[ Decl(“x”, IntT()),
Decl(“y”, BoolT())
]
, Eq(Var(“x”), Int(0))
)
Syntax of A(nnotated) Terms
!25
module ATerms
sorts Cons Term
lexical syntax
Cons = [a-zA-Z][a-zA-Z0-9]*
// more lexical syntax omitted
context-free syntax
Term.Anno = <<PreTerm>{<{Term “,"}*>}>
Term = <<PreTerm>>
PreTerm.Str = <<String>>
PreTerm.Int = <<Int>>
PreTerm.App = <<Cons>(<{Term ","}*>)>
PreTerm.List = <[<{Term ","}*>]>
PreTerm.Tuple = <(<{Term ","}*>)>
Var(“x”){Type(IntT())}
Signatures
26
Signatures
!27
context-free syntax
Exp.Uminus = [- [Exp]]
Exp.Power = [[Exp] ** [Exp]]
Exp.Times = [[Exp] * [Exp]]
Exp.Divide = [[Exp] / [Exp]]
Exp.Plus = [[Exp] + [Exp]]
Exp.Minus = [[Exp] - [Exp]]
Exp.CPlus = [[Exp] +i [Exp]]
Exp.CMinus = [[Exp] -i [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.True = <true>
Exp.False = <false>
Exp.And = [[Exp] & [Exp]]
Exp.Or = [[Exp] | [Exp]]
Signature declares argument and
return types of term constructors
Signature is automatically generated
from SDF3 productions
Stratego compiler only checks arity
of constructor applications
signature
constructors
Uminus : Exp -> Exp
Power : Exp * Exp -> Exp
Times : Exp * Exp -> Exp
Divide : Exp * Exp -> Exp
Plus : Exp * Exp -> Exp
Minus : Exp * Exp -> Exp
CPlus : Exp * Exp -> Exp
CMinus : 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
True : Exp
False : Exp
And : Exp * Exp -> Exp
Or : Exp * Exp -> Exp
Rewrite Rules
28
Desugaring
!29
desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal())
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
if x then
printint(x)
Lists of ElseIfs
!30
If(c, e1, [
ElseIf(c2, e2),
ElseIf(c3, e3),
…
])
signature
constructors
If : Exp * Exp * List(ElseIf) -> Exp
ElseIf : Exp * Exp -> ElseIf
IfThen : Exp * Exp * Exp -> Exp
Desugar :
If(c, e, []) -> IfThen(c, e, NoVal())
Desugar :
If(c, e, [ElseIf(c2, e2) | es]) -> IfThen(c, e, If(c2, e2, es))
More Desugaring
!31
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"))
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
Constant Folding
!32
x := 21 + 21 + x
eval: Plus(Int(i1), Int(i2)) -> Int(i3)
where <addS> (i1, i2) => i3
x := 42 + x
Assign(
Var("x")
, Plus(
Plus(
Int("21")
, Int("21")
)
, Var("x")
)
)
Assign(
Var("x")
, Plus(
Int("42")
, Var("x")
)
)
More Constant Folding
!33
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))
Application: Spoofax
Builders
34
Spoofax Builders
!35
rules
build :
(node, _, ast, path, project-path) -> result
with
<some-transformation> ast => result
Builder gets AST as parameter
Tiger: AST Builder
!36
rules // Debugging
debug-show-aterm:
(node, _, _, path, project-path) -> (filename, result)
with
filename := <guarantee-extension(|"aterm")> path
; result := node
trans/tiger.str
module Syntax
menus
menu: "Syntax" (openeditor)
action: "Format" = editor-format (source)
action: "Show parsed AST" = debug-show-aterm (source)
editor/syntax.esv
Builder gets AST as parameter
Application: Formatting
37
Tiger: Formatting Builder
!38
module Syntax
menus
menu: "Syntax" (openeditor)
action: "Format" = editor-format (source)
action: "Show parsed AST" = debug-show-aterm (source)
rules
editor-format:
(node, _, ast, path, project-path) -> (filename, result)
with
ext := <get-extension> path
; filename := <guarantee-extension(|$[pp.[ext]])> path
; result := <pp-debug> node
editor/syntax.esv
trans/pp.str
rules
pp-Tiger-string =
parenthesize-Tiger
; prettyprint-Tiger-start-symbols
; !V([], <id>)
; box2text-string(|120)
pp-debug :
ast -> result
with
result := <pp-Tiger-string> ast
<+ …
; result := “"
trans/pp.str
Tiger: Parenthesize
!39
module pp/Tiger-parenthesize
imports
libstratego-lib
signatures/-
strategies
parenthesize-Tiger =
innermost(TigerParenthesize)
rules
TigerParenthesize :
Or(t_0, t_1) -> Or(t_0, Parenthetical(t_1))
where <(?For(_, _, _, _)
+ ?While(_, _)
+ ?IfThen(_, _)
+ ?If(_, _, _)
+ ?Assign(_, _)
+ ?Array(_, _, _)
+ ?Or(_, _)
+ fail)> t_1
TigerParenthesize :
And(t_0, t_1) -> And(Parenthetical(t_0), t_1)
where <(?For(_, _, _, _)
+ ?While(_, _)
+ ?IfThen(_, _)
+ ?If(_, _, _)
+ ?Assign(_, _)
+ ?Array(_, _, _)
+ ?Or(_, _)
+ fail)> t_0
pp/Tiger-parenthesize.str
context-free priorities
Exp.And
> Exp.Or
> Exp.Array
> Exp.Assign
> …
Tiger: Pretty-Print Rules
!40
rules
prettyprint-Tiger-Exp :
If(t1__, t2__, t3__) -> [ H(
[SOpt(HS(), "0")]
, [ S("if ")
, t1__'
, S(" then")
]
)
, t2__'
, H(
[SOpt(HS(), "0")]
, [S("else")]
)
, t3__'
]
with t1__' := <pp-one-Z(prettyprint-Tiger-Exp)
<+ pp-one-Z(prettyprint-completion-aux)> t1__
with t2__' := <pp-indent(|"2")> [
<pp-one-Z(prettyprint-Tiger-Exp)
<+ pp-one-Z(prettyprint-completion-aux)> t2__ ]
with t3__' := <pp-indent(|"2")> [
<pp-one-Z(prettyprint-Tiger-Exp)
<+ pp-one-Z(prettyprint-completion-aux)> t3__ ]
context-free syntax
Exp.If = <
if <Exp> then
<Exp>
else
<Exp>
>
syntax/Control-Flow.sdf3
pp/Control-Flow-pp.str
Application: Desugaring
41
Tiger: Desugaring
!42
function printboard() = (
for i := 0 to N-1 do (
for j := 0 to N-1 do
print(if col[i]=j then " O" else " .");
print("n")
);
print("n")
)
function printboard() = (
let
var i : int := 0
in
while i < N - 1 do ( (
let
var j : int := 0
in
while j < N - 1 do (
print(if col[i] = j then
" O"
else
" .");
j := j + 1
)
end;
print("n")
);
i := i + 1
)
end;
print("n")
)
Expressing for in terms of while++
Tiger: Desugaring Builder
!43
rules // Desugaring
editor-desugar :
(node, _, _, path, project-path) -> (filename, result)
with
filename := <guarantee-extension(|"des.tig")> path
; result := <desugar-all; pp-Tiger-string>node
editor-desugar-ast :
(node, _, _, path, project-path) -> (filename, result)
with
filename := <guarantee-extension(|"aterm")> path
; result := <desugar-all>node
trans/tiger.str
module Transformation
menus
menu: "Transform" (openeditor) (realtime)
action: "Desugar" = editor-desugar (source)
action: "Desugar AST" = editor-desugar-ast (source)
editor/Transformation.esv
Tiger: Desugaring Transformation
!44
module desugar
imports signatures/Tiger-sig
imports …
strategies
desugar-all = topdown(try(desugar))
rules
desugar :
For(
Var(i)
, e1
, e2
, e_body
) ->
Let(
[VarDec(i, Tid("int"), e1)]
, [ While(
Lt(Var(i), e2)
, Seq(
[ e_body
, Assign(Var(i), Plus(Var(i), Int("1")))
]
)
)
]
)
Application: Outline View
45
Tiger: Outline View
!46
Tiger: Outline View Builder
!47
module Syntax
views
outline view: editor-outline (source)
expand to level: 3
editor/syntax.esv
trans/outline.str
module outline
imports
signatures/Tiger-sig
signatures/Types-sig
signatures/Records-sig
signatures/Variables-sig
signatures/Functions-sig
signatures/Bindings-sig
libspoofax/editor/outline
pp
rules
editor-outline:
(_, _, ast, path, project-path) -> outline
where
outline := <simple-label-outline(to-outline-label)> ast
Tiger: Outline View Rules
!48
rules
to-outline-label :
Let(_, _) -> $[let]
to-outline-label :
TypeDec(name, _) -> $[type [name]]
to-outline-label :
FunDec(name, _, t, _) -> $[fun [name] : [<pp-tiger-type> t]]
to-outline-label :
ProcDec(name, _, _) -> $[fun [name]]
to-outline-label :
VarDecNoType(name, _) -> $[var [name]]
to-outline-label :
VarDec(name, _, _) -> $[var [name]]
trans/outline.str
rules
to-outline-label :
Call(f, _) -> $[[f]()]
to-outline-label :
If(_, _, _) -> $[if]
to-outline-label :
For(Var(name), _, _, _) -> $[for [name]]
// etc.
Outline View: Generic Strategy
!49
module libspoofax/editor/outline
imports …
signature
constructors
Node : Label * Children -> Node
rules
simple-label-outline(s1) =
collect-om(to-outline-node(s1, fail), conc)
custom-label-outline(s1, s2) =
collect-om(origin-track-forced(s2) <+ to-outline-node(s1, s2), conc)
to-outline-node(s1, s2):
term -> Node(label, children)
where
random := <next-random>;
label := <origin-track-forced(s1; term-to-outline-label)> term;
children := <get-arguments; custom-label-outline(s1, s2)> term
term-to-outline-label =
is-string
<+ ?term{a}; origin-text; ?label; !label{a}
<+ write-to-string // fallback
Language-independent
strategy for collecting
outline nodes
Term structure for outline
nodes
Application: Completion
50
Tiger: Completion Rules
!51
rules
suggest-completions(|completions):
Exp-Plhdr() -> <add-completions(
| ( "If"
, If(
<try(inline-completions(|Exp-Plhdr()))> Exp-Plhdr()
, <try(inline-completions(|Exp-Plhdr()))> Exp-Plhdr()
, <try(inline-completions(|Exp-Plhdr()))> Exp-Plhdr()
)
)
)
; fail> completions
context-free syntax
Exp.If = <
if <Exp> then
<Exp>
else
<Exp>
>
syntax/Control-Flow.sdf3
completion/Control-Flow-cp.str
Rewriting =
Matching & Building
52
!53
!54
!55
!56
!57
!58
!59
!60
!61
!62
!63
!64
!65
!66
!67
!68
!69
Combining Rewrite Rules
with Strategies
70
!71
!72
!73
!74
!75
!76
!77
!78
!79
!80
!81
!82
Parameterized
Rewrite Rules
83
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
!84
Parameterized Rewrite Rules
Parameterized Rewrite Rules: Map
!85
[ 1
, 2
, 3
]
[ 2
, 3
, 4
]
map(inc)
inc
1
2
3
2
3
4inc
inc
map(s): [] -> []
map(s): [x|xs] -> [<s> x | <map(s)> xs]
Parameterized Rewrite Rules: Zip
!86
[ 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)
zip(s): ([],[]) -> []
zip(s): ([x|xs],[y|ys]) -> [<s> (x,y) | <zip(s)> (xs,ys)]
zip = zip(id)
Parameterized Rewrite Rules: Fold
!87
[1,2,3] foldr(!0,add) 6
[]
0
[3]
3
[2,3]
56
[1,2,3]
foldr(s1,s2): [] -> <s1>
foldr(s1,s2): [x|xs] -> <s2> (x,<foldr(s1,s2)> xs)
Parameterized Rewrite Rules: Inverse
!88
[1,2,3] inverse(|[]) [3,2,1]
[2,3]
[1][]
[1,2,3] [3]
[2,1] [3,2,1]
[]
inverse(|is): [] -> is
inverse(|is): [x|xs] -> <inverse(|[x|is])> xs
Traversal Strategies
89
!90
!91
!92
!93
!94
!95
!96
!97
!98
!99
!100
!101
!102
!103
Traversal Combinators
104
!105
!106
!107
!108
!109
!110
!111
Traversal: Topdown
!112
Const
Mul
Const
3 4 5
Const
Add1
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
topdown(s) = s ; all(topdown(s))
topdown(switch)
Traversal: Topdown
!113
Mul
Const
3
Const
4 5
Const
Add1
2
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
topdown(s) = s ; all(topdown(s))
topdown(switch)
Traversal: Topdown
!114
Mul
Const
3
Const
5 4
Const
Add1
2
3
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
topdown(s) = s ; all(topdown(s))
topdown(switch)
Traversal: Topdown/Try
!115
Const
Mul
Const
3 4 5
Const
Add1
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
topdown(s) = s ; all(topdown(s))
topdown(try(switch))
Traversal: Topdown/Try
!116
Mul
Const
3
Const
4 5
Const
Add1
2
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
topdown(s) = s ; all(topdown(s))
topdown(try(switch))
Traversal: Topdown/Try
!117
Mul
Const
3
Const
5 4
Const
Add1
2
3
4
5
6
7
8
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
topdown(s) = s ; all(topdown(s))
topdown(try(switch))
Traversal: Alltd
!118
Const
Mul
Const
3 4 5
Const
Add1
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
alltd(s) = s <+ all(alltd(s))
alltd(switch)
Traversal: Alltd
!119
Mul
Const
3
Const
4 5
Const
Add1
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
alltd(s) = s <+ all(alltd(s))
alltd(switch)
Traversal: bottomup
!120
Const
Mul
Const
3 4 5
Const
Add1
2
3
4
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
bottomup(s) = all(bottomup(s)) ; s
bottomup(switch)
Traversal: Bottomup
!121
Const
Mul
Const
3 4 5
Const
Add1
2
3
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
bottomup(s) = all(bottomup(s)) ; s
bottomup(try(switch))
Traversal: Bottomup
!122
Const
Mul
Const
3 4 5
Const
Add1
2
3
4
5
6
7
8
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
bottomup(s) = all(bottomup(s)) ; s
bottomup(try(switch))
Traversal: Bottomup
!123
Const
Mul
Const
3 4 5
Const
Add1
2
3
4
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
bottomup(s) = all(bottomup(s)) ; s
bottomup(try(switch))
Traversal: Bottomup
!124
Const
Mul
Const
3 5 4
Const
Add1
2
3
4
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
bottomup(s) = all(bottomup(s)) ; s
bottomup(try(switch))
Traversal: Bottomup
!125
Const
Mul
Const
3 5 4
Const
Add1
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
bottomup(s) = all(bottomup(s)) ; s
bottomup(try(switch))
Traversal: Bottomup
!126
Mul
Const
3
Const
5 4
Const
Add1
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
bottomup(s) = all(bottomup(s)) ; s
bottomup(try(switch))
!127
!128
Traversal: Innermost
!129
Const
Mul
Const
3 4 5
Const
Add1
2
3
4
5
6
7
8
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
innermost(s) = bottomup(try(s ; innermost(s)))
innermost(switch)
Traversal: Innermost
!130
Const
Mul
Const
3 4 5
Const
Add1
2
3
4
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
innermost(s) = bottomup(try(s ; innermost(s)))
innermost(switch)
Traversal: Innermost
!131
Const
Mul
Const
3 5 4
Const
Add1
2
3
4
9
10
11
12
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
innermost(s) = bottomup(try(s ; innermost(s)))
innermost(switch)
Traversal: Innermost
!132
Const
Mul
Const
3 5 4
Const
Add1
2
3
4
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
innermost(s) = bottomup(try(s ; innermost(s)))
innermost(switch)
Traversal: Innermost
!133
Const
Mul
Const
3 4 5
Const
Add1
2
3
4
switch: Add(e1, e2) -> Add(e2, e1)
switch: Mul(e1, e2) -> Mul(e2, e1)
innermost(s) = bottomup(try(s ; innermost(s)))
innermost(switch)
!134
!135
!136
!137
!138
!139
Type-Unifying
Transformations
140
!141
!142
!143
!144
!145
!146
!147
!148
!149
!150
!151
!152
!153
!154
!155
!156
!157
!158
!159
!160
!161
!162
!163
!164
!165
!166
!167
!168
!169
!170
!171
!172
Next: Type Checking
173
!174
Except where otherwise noted, this work is licensed under

More Related Content

What's hot

Declare Your Language: Transformation by Strategic Term Rewriting
Declare Your Language: Transformation by Strategic Term RewritingDeclare Your Language: Transformation by Strategic Term Rewriting
Declare Your Language: Transformation by Strategic Term Rewriting
Eelco Visser
 
Declare Your Language: Type Checking
Declare Your Language: Type CheckingDeclare Your Language: Type Checking
Declare Your Language: Type Checking
Eelco Visser
 
Declare Your Language: Name Resolution
Declare Your Language: Name ResolutionDeclare Your Language: Name Resolution
Declare Your Language: Name Resolution
Eelco Visser
 
CS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingCS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | Parsing
Eelco Visser
 
Compiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesCompiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual Machines
Eelco Visser
 
Declare Your Language: Syntax Definition
Declare Your Language: Syntax DefinitionDeclare Your Language: Syntax Definition
Declare Your Language: Syntax Definition
Eelco Visser
 
Declarative Semantics Definition - Term Rewriting
Declarative Semantics Definition - Term RewritingDeclarative Semantics Definition - Term Rewriting
Declarative Semantics Definition - Term Rewriting
Guido Wachsmuth
 
Chapter 22. Lambda Expressions and LINQ
Chapter 22. Lambda Expressions and LINQChapter 22. Lambda Expressions and LINQ
Chapter 22. Lambda Expressions and LINQ
Intro C# Book
 
Declare Your Language: Syntactic (Editor) Services
Declare Your Language: Syntactic (Editor) ServicesDeclare Your Language: Syntactic (Editor) Services
Declare Your Language: Syntactic (Editor) Services
Eelco Visser
 
Compiler Construction | Lecture 4 | Parsing
Compiler Construction | Lecture 4 | Parsing Compiler Construction | Lecture 4 | Parsing
Compiler Construction | Lecture 4 | Parsing
Eelco Visser
 
Dynamic Semantics Specification and Interpreter Generation
Dynamic Semantics Specification and Interpreter GenerationDynamic Semantics Specification and Interpreter Generation
Dynamic Semantics Specification and Interpreter Generation
Eelco Visser
 
Writing Parsers and Compilers with PLY
Writing Parsers and Compilers with PLYWriting Parsers and Compilers with PLY
Writing Parsers and Compilers with PLY
David Beazley (Dabeaz LLC)
 
Java 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardJava 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardMario Fusco
 
Advanced C - Part 2
Advanced C - Part 2Advanced C - Part 2
Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?
Andrey Akinshin
 
Term Rewriting
Term RewritingTerm Rewriting
Term Rewriting
Eelco Visser
 
Functional programming in Python
Functional programming in PythonFunctional programming in Python
Functional programming in PythonColin Su
 
Write Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 HoursWrite Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 Hours
Phillip Trelford
 
Lex (lexical analyzer)
Lex (lexical analyzer)Lex (lexical analyzer)
Lex (lexical analyzer)
Sami Said
 

What's hot (20)

Declare Your Language: Transformation by Strategic Term Rewriting
Declare Your Language: Transformation by Strategic Term RewritingDeclare Your Language: Transformation by Strategic Term Rewriting
Declare Your Language: Transformation by Strategic Term Rewriting
 
Declare Your Language: Type Checking
Declare Your Language: Type CheckingDeclare Your Language: Type Checking
Declare Your Language: Type Checking
 
Declare Your Language: Name Resolution
Declare Your Language: Name ResolutionDeclare Your Language: Name Resolution
Declare Your Language: Name Resolution
 
CS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingCS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | Parsing
 
Compiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesCompiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual Machines
 
Declare Your Language: Syntax Definition
Declare Your Language: Syntax DefinitionDeclare Your Language: Syntax Definition
Declare Your Language: Syntax Definition
 
Declarative Semantics Definition - Term Rewriting
Declarative Semantics Definition - Term RewritingDeclarative Semantics Definition - Term Rewriting
Declarative Semantics Definition - Term Rewriting
 
Chapter 22. Lambda Expressions and LINQ
Chapter 22. Lambda Expressions and LINQChapter 22. Lambda Expressions and LINQ
Chapter 22. Lambda Expressions and LINQ
 
Declare Your Language: Syntactic (Editor) Services
Declare Your Language: Syntactic (Editor) ServicesDeclare Your Language: Syntactic (Editor) Services
Declare Your Language: Syntactic (Editor) Services
 
Compiler Construction | Lecture 4 | Parsing
Compiler Construction | Lecture 4 | Parsing Compiler Construction | Lecture 4 | Parsing
Compiler Construction | Lecture 4 | Parsing
 
Dynamic Semantics Specification and Interpreter Generation
Dynamic Semantics Specification and Interpreter GenerationDynamic Semantics Specification and Interpreter Generation
Dynamic Semantics Specification and Interpreter Generation
 
Writing Parsers and Compilers with PLY
Writing Parsers and Compilers with PLYWriting Parsers and Compilers with PLY
Writing Parsers and Compilers with PLY
 
Java 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forwardJava 7, 8 & 9 - Moving the language forward
Java 7, 8 & 9 - Moving the language forward
 
Advanced C - Part 2
Advanced C - Part 2Advanced C - Part 2
Advanced C - Part 2
 
Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?Что нам готовит грядущий C#7?
Что нам готовит грядущий C#7?
 
Term Rewriting
Term RewritingTerm Rewriting
Term Rewriting
 
Functional programming in Python
Functional programming in PythonFunctional programming in Python
Functional programming in Python
 
Write Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 HoursWrite Your Own Compiler in 24 Hours
Write Your Own Compiler in 24 Hours
 
Lex (lexical analyzer)
Lex (lexical analyzer)Lex (lexical analyzer)
Lex (lexical analyzer)
 
Antlr V3
Antlr V3Antlr V3
Antlr V3
 

Similar to CS4200 2019 | Lecture 5 | Transformation by Term Rewriting

1st and 2nd Semester M Tech: Computer Science and Engineering (Dec-2015; Jan-...
1st and 2nd Semester M Tech: Computer Science and Engineering (Dec-2015; Jan-...1st and 2nd Semester M Tech: Computer Science and Engineering (Dec-2015; Jan-...
1st and 2nd Semester M Tech: Computer Science and Engineering (Dec-2015; Jan-...
BGS Institute of Technology, Adichunchanagiri University (ACU)
 
Profiling and optimization
Profiling and optimizationProfiling and optimization
Profiling and optimizationg3_nittala
 
time_complexity_list_02_04_2024_22_pages.pdf
time_complexity_list_02_04_2024_22_pages.pdftime_complexity_list_02_04_2024_22_pages.pdf
time_complexity_list_02_04_2024_22_pages.pdf
SrinivasaReddyPolamR
 
[FT-11][suhorng] “Poor Man's” Undergraduate Compilers
[FT-11][suhorng] “Poor Man's” Undergraduate Compilers[FT-11][suhorng] “Poor Man's” Undergraduate Compilers
[FT-11][suhorng] “Poor Man's” Undergraduate Compilers
Functional Thursday
 
JavaScript Editions ES7, ES8 and ES9 vs V8
JavaScript Editions ES7, ES8 and ES9 vs V8JavaScript Editions ES7, ES8 and ES9 vs V8
JavaScript Editions ES7, ES8 and ES9 vs V8
Rafael Casuso Romate
 
Introducción a Elixir
Introducción a ElixirIntroducción a Elixir
Introducción a Elixir
Svet Ivantchev
 
C# programming
C# programming C# programming
C# programming
umesh patil
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
Guillaume Laforge
 
19. algorithms and-complexity
19. algorithms and-complexity19. algorithms and-complexity
19. algorithms and-complexity
showkat27
 
Elm kyivfprog 2015
Elm kyivfprog 2015Elm kyivfprog 2015
Elm kyivfprog 2015
Alexander Mostovenko
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
Clojure for Data Science
Clojure for Data ScienceClojure for Data Science
Clojure for Data Science
Mike Anderson
 
Summary of C++17 features
Summary of C++17 featuresSummary of C++17 features
Summary of C++17 features
Bartlomiej Filipek
 
Creating Lazy stream in CSharp
Creating Lazy stream in CSharpCreating Lazy stream in CSharp
Creating Lazy stream in CSharp
Dhaval Dalal
 
Clojure: Simple By Design
Clojure: Simple By DesignClojure: Simple By Design
Clojure: Simple By Design
All Things Open
 
Abstracting Vector Architectures in Library Generators: Case Study Convolutio...
Abstracting Vector Architectures in Library Generators: Case Study Convolutio...Abstracting Vector Architectures in Library Generators: Case Study Convolutio...
Abstracting Vector Architectures in Library Generators: Case Study Convolutio...
ETH Zurich
 
Patterns 200711
Patterns 200711Patterns 200711
Patterns 200711ClarkTony
 
Designing Architecture-aware Library using Boost.Proto
Designing Architecture-aware Library using Boost.ProtoDesigning Architecture-aware Library using Boost.Proto
Designing Architecture-aware Library using Boost.Proto
Joel Falcou
 
Pune Clojure Course Outline
Pune Clojure Course OutlinePune Clojure Course Outline
Pune Clojure Course Outline
Baishampayan Ghose
 

Similar to CS4200 2019 | Lecture 5 | Transformation by Term Rewriting (20)

1st and 2nd Semester M Tech: Computer Science and Engineering (Dec-2015; Jan-...
1st and 2nd Semester M Tech: Computer Science and Engineering (Dec-2015; Jan-...1st and 2nd Semester M Tech: Computer Science and Engineering (Dec-2015; Jan-...
1st and 2nd Semester M Tech: Computer Science and Engineering (Dec-2015; Jan-...
 
Profiling and optimization
Profiling and optimizationProfiling and optimization
Profiling and optimization
 
time_complexity_list_02_04_2024_22_pages.pdf
time_complexity_list_02_04_2024_22_pages.pdftime_complexity_list_02_04_2024_22_pages.pdf
time_complexity_list_02_04_2024_22_pages.pdf
 
[FT-11][suhorng] “Poor Man's” Undergraduate Compilers
[FT-11][suhorng] “Poor Man's” Undergraduate Compilers[FT-11][suhorng] “Poor Man's” Undergraduate Compilers
[FT-11][suhorng] “Poor Man's” Undergraduate Compilers
 
JavaScript Editions ES7, ES8 and ES9 vs V8
JavaScript Editions ES7, ES8 and ES9 vs V8JavaScript Editions ES7, ES8 and ES9 vs V8
JavaScript Editions ES7, ES8 and ES9 vs V8
 
Faster Python, FOSDEM
Faster Python, FOSDEMFaster Python, FOSDEM
Faster Python, FOSDEM
 
Introducción a Elixir
Introducción a ElixirIntroducción a Elixir
Introducción a Elixir
 
C# programming
C# programming C# programming
C# programming
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
19. algorithms and-complexity
19. algorithms and-complexity19. algorithms and-complexity
19. algorithms and-complexity
 
Elm kyivfprog 2015
Elm kyivfprog 2015Elm kyivfprog 2015
Elm kyivfprog 2015
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
Clojure for Data Science
Clojure for Data ScienceClojure for Data Science
Clojure for Data Science
 
Summary of C++17 features
Summary of C++17 featuresSummary of C++17 features
Summary of C++17 features
 
Creating Lazy stream in CSharp
Creating Lazy stream in CSharpCreating Lazy stream in CSharp
Creating Lazy stream in CSharp
 
Clojure: Simple By Design
Clojure: Simple By DesignClojure: Simple By Design
Clojure: Simple By Design
 
Abstracting Vector Architectures in Library Generators: Case Study Convolutio...
Abstracting Vector Architectures in Library Generators: Case Study Convolutio...Abstracting Vector Architectures in Library Generators: Case Study Convolutio...
Abstracting Vector Architectures in Library Generators: Case Study Convolutio...
 
Patterns 200711
Patterns 200711Patterns 200711
Patterns 200711
 
Designing Architecture-aware Library using Boost.Proto
Designing Architecture-aware Library using Boost.ProtoDesigning Architecture-aware Library using Boost.Proto
Designing Architecture-aware Library using Boost.Proto
 
Pune Clojure Course Outline
Pune Clojure Course OutlinePune Clojure Course Outline
Pune Clojure Course Outline
 

More from Eelco Visser

CS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionCS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: Introduction
Eelco Visser
 
A Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesA Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation Rules
Eelco Visser
 
Compiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionCompiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler Construction
Eelco Visser
 
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Eelco Visser
 
Compiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementCompiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory Management
Eelco Visser
 
Compiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationCompiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code Generation
Eelco Visser
 
Compiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksCompiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone Frameworks
Eelco Visser
 
Compiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisCompiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow Analysis
Eelco Visser
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type Checking
Eelco Visser
 
Compiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisCompiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static Analysis
Eelco Visser
 
Compiler Construction | Lecture 3 | Syntactic Editor Services
Compiler Construction | Lecture 3 | Syntactic Editor ServicesCompiler Construction | Lecture 3 | Syntactic Editor Services
Compiler Construction | Lecture 3 | Syntactic Editor Services
Eelco Visser
 
Compiler Construction | Lecture 1 | What is a compiler?
Compiler Construction | Lecture 1 | What is a compiler?Compiler Construction | Lecture 1 | What is a compiler?
Compiler Construction | Lecture 1 | What is a compiler?
Eelco Visser
 
Declare Your Language: Virtual Machines & Code Generation
Declare Your Language: Virtual Machines & Code GenerationDeclare Your Language: Virtual Machines & Code Generation
Declare Your Language: Virtual Machines & Code Generation
Eelco Visser
 
Declare Your Language: Dynamic Semantics
Declare Your Language: Dynamic SemanticsDeclare Your Language: Dynamic Semantics
Declare Your Language: Dynamic Semantics
Eelco Visser
 
Declare Your Language: Constraint Resolution 2
Declare Your Language: Constraint Resolution 2Declare Your Language: Constraint Resolution 2
Declare Your Language: Constraint Resolution 2
Eelco Visser
 
Declare Your Language: Constraint Resolution 1
Declare Your Language: Constraint Resolution 1Declare Your Language: Constraint Resolution 1
Declare Your Language: Constraint Resolution 1
Eelco Visser
 

More from Eelco Visser (16)

CS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionCS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: Introduction
 
A Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesA Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation Rules
 
Compiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionCompiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler Construction
 
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
 
Compiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementCompiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory Management
 
Compiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationCompiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code Generation
 
Compiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksCompiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone Frameworks
 
Compiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisCompiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow Analysis
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type Checking
 
Compiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisCompiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static Analysis
 
Compiler Construction | Lecture 3 | Syntactic Editor Services
Compiler Construction | Lecture 3 | Syntactic Editor ServicesCompiler Construction | Lecture 3 | Syntactic Editor Services
Compiler Construction | Lecture 3 | Syntactic Editor Services
 
Compiler Construction | Lecture 1 | What is a compiler?
Compiler Construction | Lecture 1 | What is a compiler?Compiler Construction | Lecture 1 | What is a compiler?
Compiler Construction | Lecture 1 | What is a compiler?
 
Declare Your Language: Virtual Machines & Code Generation
Declare Your Language: Virtual Machines & Code GenerationDeclare Your Language: Virtual Machines & Code Generation
Declare Your Language: Virtual Machines & Code Generation
 
Declare Your Language: Dynamic Semantics
Declare Your Language: Dynamic SemanticsDeclare Your Language: Dynamic Semantics
Declare Your Language: Dynamic Semantics
 
Declare Your Language: Constraint Resolution 2
Declare Your Language: Constraint Resolution 2Declare Your Language: Constraint Resolution 2
Declare Your Language: Constraint Resolution 2
 
Declare Your Language: Constraint Resolution 1
Declare Your Language: Constraint Resolution 1Declare Your Language: Constraint Resolution 1
Declare Your Language: Constraint Resolution 1
 

Recently uploaded

Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
IES VE
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Cyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdfCyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdf
Cyanic lab
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Natan Silnitsky
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
kalichargn70th171
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
takuyayamamoto1800
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
AMB-Review
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
Tendenci - The Open Source AMS (Association Management Software)
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
wottaspaceseo
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
Georgi Kodinov
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
Globus
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 

Recently uploaded (20)

Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Cyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdfCyaniclab : Software Development Agency Portfolio.pdf
Cyaniclab : Software Development Agency Portfolio.pdf
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamOpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoam
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
 
Vitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume MontevideoVitthal Shirke Microservices Resume Montevideo
Vitthal Shirke Microservices Resume Montevideo
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
How Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptxHow Recreation Management Software Can Streamline Your Operations.pptx
How Recreation Management Software Can Streamline Your Operations.pptx
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx2024 RoOUG Security model for the cloud.pptx
2024 RoOUG Security model for the cloud.pptx
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 

CS4200 2019 | Lecture 5 | Transformation by Term Rewriting

  • 1. Eelco Visser CS4200 Compiler Construction TU Delft September 2019 Lecture 5: Transformation by Term Rewriting
  • 2. Channel on research group Slack Where many Spoofax users hang out Ask questions about Spoofax (Not answers to assignments) No guarantee to quick response, or answer at all Send me an email if you want an invitation !2 #spoofax-users
  • 4. Reading Material 4 The following papers add background, conceptual exposition, and examples to the material from the slides. Some notation and technical details have been changed; check the documentation.
  • 5. !5 Term rewrite rules define transformations on (abstract syntax) trees. Traditional rewrite systems apply rules exhaustively. This paper introduces programmable rewriting strategies to control the application of rules, the core of the design of the Stratego transformation language. Note that the notation for contextual rules is no longer supported by Stratego. However, the technique to implement contextual rules still applies. https://doi.org/10.1145/291251.289425 ICFP 1998
  • 6. !6 Stratego/XT combines SDF2 and Stratego into toolset for program transformation. This paper gives a high-level overview of the concepts. The StrategoXT.jar is still part of the Spoofax distribution. https://doi.org/10.1007/978-3-540-25935-0_13 Lecture Notes in Computer Science 2003
  • 7. !7 Spoofax combines SDF2 and Stratego into a language workbench, i.e. an IDE for creating language definition from which IDEs for the defined languages can be generated. A distinctive feature of Spoofax is live language development, which supports developing a language definition and programs in the defined language in the same IDE instance. Spoofax was developed for Eclipse, which is still the main development platform. However, Spoofax Core is now independent of any IDE. https://doi.org/10.1145/1932682.1869497 OOPSLA 2010 Note that the since the publication of this paper, we have introduced more declarative approaches to name and type analysis, which will be the topic of the next lectures.
  • 8. !8 Documentation for Stratego at the metaborg.org website. http://www.metaborg.org/en/latest/source/langdev/meta/lang/stratego/index.html
  • 9. !9 This paper defines the formal semantics of the full Stratego language, including its scoped dynamic rules feature. If you want to dig deeper These slides document most features of the base language without dynamic rules and without giving the formal semantics.
  • 10. Transformation Architecture 10 This presentation uses the Stratego Shell for explaining the behavior of Stratego programs. The Stratego Shell is currently not supported by Spoofax
  • 11. !11
  • 12. !12
  • 13. !13
  • 14. !14
  • 15. !15
  • 16. !16
  • 17. !17
  • 18. !18
  • 19. !19
  • 21. Parsing: From Text to Terms !21 Let( [ FunDec( "fact" , [FArg("n", Tp(Tid("int")))] , Tp(Tid("int")) , If( Lt(Var("n"), Int("1")) , Int("1") , Seq( [ Times( Var("n") , Call( Var("fact") , [Minus(Var("n"), Int("1"))] ) ) ] ) ) ) ] , [Call(Var("fact"), [Int("10")])] ) let function fact(n : int) : int = if n < 1 then 1 else (n * fact(n - 1)) in fact(10) end
  • 22. Syntax of Terms !22 module Terms sorts Cons Term lexical syntax Cons = [a-zA-Z][a-zA-Z0-9]* context-free syntax Term.App = <<Cons>(<{Term ","}*>)> Zero() Succ(Zero()) Cons(A(), Cons(B(), Nil()))
  • 23. Syntax of Terms !23 module Terms sorts Cons Term lexical syntax Cons = [a-zA-Z][a-zA-Z0-9]* context-free syntax Term.App = <<Cons>(<{Term ","}*>)> Term.List = <[<{Term ","}*>]> Term.Tuple = <(<{Term ","}*>)> Zero() Succ(Zero()) [A(), B()]
  • 24. module ATerms sorts Cons Term lexical syntax Cons = [a-zA-Z][a-zA-Z0-9]* Cons = String Int = [0-9]+ String = """ StringChar* """ StringChar = ~["n] StringChar = "" ["] context-free syntax Term.Str = <<String>> Term.Int = <<Int>> Term.App = <<Cons>(<{Term ","}*>)> Term.List = <[<{Term ","}*>]> Term.Tuple = <(<{Term ","}*>)> Syntax of Terms !24 0 1 [A(), B()] Var(“x”) Let( [ Decl(“x”, IntT()), Decl(“y”, BoolT()) ] , Eq(Var(“x”), Int(0)) )
  • 25. Syntax of A(nnotated) Terms !25 module ATerms sorts Cons Term lexical syntax Cons = [a-zA-Z][a-zA-Z0-9]* // more lexical syntax omitted context-free syntax Term.Anno = <<PreTerm>{<{Term “,"}*>}> Term = <<PreTerm>> PreTerm.Str = <<String>> PreTerm.Int = <<Int>> PreTerm.App = <<Cons>(<{Term ","}*>)> PreTerm.List = <[<{Term ","}*>]> PreTerm.Tuple = <(<{Term ","}*>)> Var(“x”){Type(IntT())}
  • 27. Signatures !27 context-free syntax Exp.Uminus = [- [Exp]] Exp.Power = [[Exp] ** [Exp]] Exp.Times = [[Exp] * [Exp]] Exp.Divide = [[Exp] / [Exp]] Exp.Plus = [[Exp] + [Exp]] Exp.Minus = [[Exp] - [Exp]] Exp.CPlus = [[Exp] +i [Exp]] Exp.CMinus = [[Exp] -i [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.True = <true> Exp.False = <false> Exp.And = [[Exp] & [Exp]] Exp.Or = [[Exp] | [Exp]] Signature declares argument and return types of term constructors Signature is automatically generated from SDF3 productions Stratego compiler only checks arity of constructor applications signature constructors Uminus : Exp -> Exp Power : Exp * Exp -> Exp Times : Exp * Exp -> Exp Divide : Exp * Exp -> Exp Plus : Exp * Exp -> Exp Minus : Exp * Exp -> Exp CPlus : Exp * Exp -> Exp CMinus : 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 True : Exp False : Exp And : Exp * Exp -> Exp Or : Exp * Exp -> Exp
  • 29. Desugaring !29 desugar: IfThen(e1, e2) -> IfThenElse(e1, e2, NoVal()) 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 if x then printint(x)
  • 30. Lists of ElseIfs !30 If(c, e1, [ ElseIf(c2, e2), ElseIf(c3, e3), … ]) signature constructors If : Exp * Exp * List(ElseIf) -> Exp ElseIf : Exp * Exp -> ElseIf IfThen : Exp * Exp * Exp -> Exp Desugar : If(c, e, []) -> IfThen(c, e, NoVal()) Desugar : If(c, e, [ElseIf(c2, e2) | es]) -> IfThen(c, e, If(c2, e2, es))
  • 31. More Desugaring !31 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")) 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
  • 32. Constant Folding !32 x := 21 + 21 + x eval: Plus(Int(i1), Int(i2)) -> Int(i3) where <addS> (i1, i2) => i3 x := 42 + x Assign( Var("x") , Plus( Plus( Int("21") , Int("21") ) , Var("x") ) ) Assign( Var("x") , Plus( Int("42") , Var("x") ) )
  • 33. More Constant Folding !33 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))
  • 35. Spoofax Builders !35 rules build : (node, _, ast, path, project-path) -> result with <some-transformation> ast => result Builder gets AST as parameter
  • 36. Tiger: AST Builder !36 rules // Debugging debug-show-aterm: (node, _, _, path, project-path) -> (filename, result) with filename := <guarantee-extension(|"aterm")> path ; result := node trans/tiger.str module Syntax menus menu: "Syntax" (openeditor) action: "Format" = editor-format (source) action: "Show parsed AST" = debug-show-aterm (source) editor/syntax.esv Builder gets AST as parameter
  • 38. Tiger: Formatting Builder !38 module Syntax menus menu: "Syntax" (openeditor) action: "Format" = editor-format (source) action: "Show parsed AST" = debug-show-aterm (source) rules editor-format: (node, _, ast, path, project-path) -> (filename, result) with ext := <get-extension> path ; filename := <guarantee-extension(|$[pp.[ext]])> path ; result := <pp-debug> node editor/syntax.esv trans/pp.str rules pp-Tiger-string = parenthesize-Tiger ; prettyprint-Tiger-start-symbols ; !V([], <id>) ; box2text-string(|120) pp-debug : ast -> result with result := <pp-Tiger-string> ast <+ … ; result := “" trans/pp.str
  • 39. Tiger: Parenthesize !39 module pp/Tiger-parenthesize imports libstratego-lib signatures/- strategies parenthesize-Tiger = innermost(TigerParenthesize) rules TigerParenthesize : Or(t_0, t_1) -> Or(t_0, Parenthetical(t_1)) where <(?For(_, _, _, _) + ?While(_, _) + ?IfThen(_, _) + ?If(_, _, _) + ?Assign(_, _) + ?Array(_, _, _) + ?Or(_, _) + fail)> t_1 TigerParenthesize : And(t_0, t_1) -> And(Parenthetical(t_0), t_1) where <(?For(_, _, _, _) + ?While(_, _) + ?IfThen(_, _) + ?If(_, _, _) + ?Assign(_, _) + ?Array(_, _, _) + ?Or(_, _) + fail)> t_0 pp/Tiger-parenthesize.str context-free priorities Exp.And > Exp.Or > Exp.Array > Exp.Assign > …
  • 40. Tiger: Pretty-Print Rules !40 rules prettyprint-Tiger-Exp : If(t1__, t2__, t3__) -> [ H( [SOpt(HS(), "0")] , [ S("if ") , t1__' , S(" then") ] ) , t2__' , H( [SOpt(HS(), "0")] , [S("else")] ) , t3__' ] with t1__' := <pp-one-Z(prettyprint-Tiger-Exp) <+ pp-one-Z(prettyprint-completion-aux)> t1__ with t2__' := <pp-indent(|"2")> [ <pp-one-Z(prettyprint-Tiger-Exp) <+ pp-one-Z(prettyprint-completion-aux)> t2__ ] with t3__' := <pp-indent(|"2")> [ <pp-one-Z(prettyprint-Tiger-Exp) <+ pp-one-Z(prettyprint-completion-aux)> t3__ ] context-free syntax Exp.If = < if <Exp> then <Exp> else <Exp> > syntax/Control-Flow.sdf3 pp/Control-Flow-pp.str
  • 42. Tiger: Desugaring !42 function printboard() = ( for i := 0 to N-1 do ( for j := 0 to N-1 do print(if col[i]=j then " O" else " ."); print("n") ); print("n") ) function printboard() = ( let var i : int := 0 in while i < N - 1 do ( ( let var j : int := 0 in while j < N - 1 do ( print(if col[i] = j then " O" else " ."); j := j + 1 ) end; print("n") ); i := i + 1 ) end; print("n") ) Expressing for in terms of while++
  • 43. Tiger: Desugaring Builder !43 rules // Desugaring editor-desugar : (node, _, _, path, project-path) -> (filename, result) with filename := <guarantee-extension(|"des.tig")> path ; result := <desugar-all; pp-Tiger-string>node editor-desugar-ast : (node, _, _, path, project-path) -> (filename, result) with filename := <guarantee-extension(|"aterm")> path ; result := <desugar-all>node trans/tiger.str module Transformation menus menu: "Transform" (openeditor) (realtime) action: "Desugar" = editor-desugar (source) action: "Desugar AST" = editor-desugar-ast (source) editor/Transformation.esv
  • 44. Tiger: Desugaring Transformation !44 module desugar imports signatures/Tiger-sig imports … strategies desugar-all = topdown(try(desugar)) rules desugar : For( Var(i) , e1 , e2 , e_body ) -> Let( [VarDec(i, Tid("int"), e1)] , [ While( Lt(Var(i), e2) , Seq( [ e_body , Assign(Var(i), Plus(Var(i), Int("1"))) ] ) ) ] )
  • 47. Tiger: Outline View Builder !47 module Syntax views outline view: editor-outline (source) expand to level: 3 editor/syntax.esv trans/outline.str module outline imports signatures/Tiger-sig signatures/Types-sig signatures/Records-sig signatures/Variables-sig signatures/Functions-sig signatures/Bindings-sig libspoofax/editor/outline pp rules editor-outline: (_, _, ast, path, project-path) -> outline where outline := <simple-label-outline(to-outline-label)> ast
  • 48. Tiger: Outline View Rules !48 rules to-outline-label : Let(_, _) -> $[let] to-outline-label : TypeDec(name, _) -> $[type [name]] to-outline-label : FunDec(name, _, t, _) -> $[fun [name] : [<pp-tiger-type> t]] to-outline-label : ProcDec(name, _, _) -> $[fun [name]] to-outline-label : VarDecNoType(name, _) -> $[var [name]] to-outline-label : VarDec(name, _, _) -> $[var [name]] trans/outline.str rules to-outline-label : Call(f, _) -> $[[f]()] to-outline-label : If(_, _, _) -> $[if] to-outline-label : For(Var(name), _, _, _) -> $[for [name]] // etc.
  • 49. Outline View: Generic Strategy !49 module libspoofax/editor/outline imports … signature constructors Node : Label * Children -> Node rules simple-label-outline(s1) = collect-om(to-outline-node(s1, fail), conc) custom-label-outline(s1, s2) = collect-om(origin-track-forced(s2) <+ to-outline-node(s1, s2), conc) to-outline-node(s1, s2): term -> Node(label, children) where random := <next-random>; label := <origin-track-forced(s1; term-to-outline-label)> term; children := <get-arguments; custom-label-outline(s1, s2)> term term-to-outline-label = is-string <+ ?term{a}; origin-text; ?label; !label{a} <+ write-to-string // fallback Language-independent strategy for collecting outline nodes Term structure for outline nodes
  • 51. Tiger: Completion Rules !51 rules suggest-completions(|completions): Exp-Plhdr() -> <add-completions( | ( "If" , If( <try(inline-completions(|Exp-Plhdr()))> Exp-Plhdr() , <try(inline-completions(|Exp-Plhdr()))> Exp-Plhdr() , <try(inline-completions(|Exp-Plhdr()))> Exp-Plhdr() ) ) ) ; fail> completions context-free syntax Exp.If = < if <Exp> then <Exp> else <Exp> > syntax/Control-Flow.sdf3 completion/Control-Flow-cp.str
  • 52. Rewriting = Matching & Building 52
  • 53. !53
  • 54. !54
  • 55. !55
  • 56. !56
  • 57. !57
  • 58. !58
  • 59. !59
  • 60. !60
  • 61. !61
  • 62. !62
  • 63. !63
  • 64. !64
  • 65. !65
  • 66. !66
  • 67. !67
  • 68. !68
  • 69. !69
  • 71. !71
  • 72. !72
  • 73. !73
  • 74. !74
  • 75. !75
  • 76. !76
  • 77. !77
  • 78. !78
  • 79. !79
  • 80. !80
  • 81. !81
  • 82. !82
  • 84. 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 !84 Parameterized Rewrite Rules
  • 85. Parameterized Rewrite Rules: Map !85 [ 1 , 2 , 3 ] [ 2 , 3 , 4 ] map(inc) inc 1 2 3 2 3 4inc inc map(s): [] -> [] map(s): [x|xs] -> [<s> x | <map(s)> xs]
  • 86. Parameterized Rewrite Rules: Zip !86 [ 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) zip(s): ([],[]) -> [] zip(s): ([x|xs],[y|ys]) -> [<s> (x,y) | <zip(s)> (xs,ys)] zip = zip(id)
  • 87. Parameterized Rewrite Rules: Fold !87 [1,2,3] foldr(!0,add) 6 [] 0 [3] 3 [2,3] 56 [1,2,3] foldr(s1,s2): [] -> <s1> foldr(s1,s2): [x|xs] -> <s2> (x,<foldr(s1,s2)> xs)
  • 88. Parameterized Rewrite Rules: Inverse !88 [1,2,3] inverse(|[]) [3,2,1] [2,3] [1][] [1,2,3] [3] [2,1] [3,2,1] [] inverse(|is): [] -> is inverse(|is): [x|xs] -> <inverse(|[x|is])> xs
  • 90. !90
  • 91. !91
  • 92. !92
  • 93. !93
  • 94. !94
  • 95. !95
  • 96. !96
  • 97. !97
  • 98. !98
  • 99. !99
  • 100. !100
  • 101. !101
  • 102. !102
  • 103. !103
  • 105. !105
  • 106. !106
  • 107. !107
  • 108. !108
  • 109. !109
  • 110. !110
  • 111. !111
  • 112. Traversal: Topdown !112 Const Mul Const 3 4 5 Const Add1 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) topdown(s) = s ; all(topdown(s)) topdown(switch)
  • 113. Traversal: Topdown !113 Mul Const 3 Const 4 5 Const Add1 2 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) topdown(s) = s ; all(topdown(s)) topdown(switch)
  • 114. Traversal: Topdown !114 Mul Const 3 Const 5 4 Const Add1 2 3 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) topdown(s) = s ; all(topdown(s)) topdown(switch)
  • 115. Traversal: Topdown/Try !115 Const Mul Const 3 4 5 Const Add1 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) topdown(s) = s ; all(topdown(s)) topdown(try(switch))
  • 116. Traversal: Topdown/Try !116 Mul Const 3 Const 4 5 Const Add1 2 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) topdown(s) = s ; all(topdown(s)) topdown(try(switch))
  • 117. Traversal: Topdown/Try !117 Mul Const 3 Const 5 4 Const Add1 2 3 4 5 6 7 8 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) topdown(s) = s ; all(topdown(s)) topdown(try(switch))
  • 118. Traversal: Alltd !118 Const Mul Const 3 4 5 Const Add1 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) alltd(s) = s <+ all(alltd(s)) alltd(switch)
  • 119. Traversal: Alltd !119 Mul Const 3 Const 4 5 Const Add1 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) alltd(s) = s <+ all(alltd(s)) alltd(switch)
  • 120. Traversal: bottomup !120 Const Mul Const 3 4 5 Const Add1 2 3 4 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) bottomup(s) = all(bottomup(s)) ; s bottomup(switch)
  • 121. Traversal: Bottomup !121 Const Mul Const 3 4 5 Const Add1 2 3 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) bottomup(s) = all(bottomup(s)) ; s bottomup(try(switch))
  • 122. Traversal: Bottomup !122 Const Mul Const 3 4 5 Const Add1 2 3 4 5 6 7 8 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) bottomup(s) = all(bottomup(s)) ; s bottomup(try(switch))
  • 123. Traversal: Bottomup !123 Const Mul Const 3 4 5 Const Add1 2 3 4 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) bottomup(s) = all(bottomup(s)) ; s bottomup(try(switch))
  • 124. Traversal: Bottomup !124 Const Mul Const 3 5 4 Const Add1 2 3 4 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) bottomup(s) = all(bottomup(s)) ; s bottomup(try(switch))
  • 125. Traversal: Bottomup !125 Const Mul Const 3 5 4 Const Add1 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) bottomup(s) = all(bottomup(s)) ; s bottomup(try(switch))
  • 126. Traversal: Bottomup !126 Mul Const 3 Const 5 4 Const Add1 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) bottomup(s) = all(bottomup(s)) ; s bottomup(try(switch))
  • 127. !127
  • 128. !128
  • 129. Traversal: Innermost !129 Const Mul Const 3 4 5 Const Add1 2 3 4 5 6 7 8 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) innermost(s) = bottomup(try(s ; innermost(s))) innermost(switch)
  • 130. Traversal: Innermost !130 Const Mul Const 3 4 5 Const Add1 2 3 4 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) innermost(s) = bottomup(try(s ; innermost(s))) innermost(switch)
  • 131. Traversal: Innermost !131 Const Mul Const 3 5 4 Const Add1 2 3 4 9 10 11 12 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) innermost(s) = bottomup(try(s ; innermost(s))) innermost(switch)
  • 132. Traversal: Innermost !132 Const Mul Const 3 5 4 Const Add1 2 3 4 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) innermost(s) = bottomup(try(s ; innermost(s))) innermost(switch)
  • 133. Traversal: Innermost !133 Const Mul Const 3 4 5 Const Add1 2 3 4 switch: Add(e1, e2) -> Add(e2, e1) switch: Mul(e1, e2) -> Mul(e2, e1) innermost(s) = bottomup(try(s ; innermost(s))) innermost(switch)
  • 134. !134
  • 135. !135
  • 136. !136
  • 137. !137
  • 138. !138
  • 139. !139
  • 141. !141
  • 142. !142
  • 143. !143
  • 144. !144
  • 145. !145
  • 146. !146
  • 147. !147
  • 148. !148
  • 149. !149
  • 150. !150
  • 151. !151
  • 152. !152
  • 153. !153
  • 154. !154
  • 155. !155
  • 156. !156
  • 157. !157
  • 158. !158
  • 159. !159
  • 160. !160
  • 161. !161
  • 162. !162
  • 163. !163
  • 164. !164
  • 165. !165
  • 166. !166
  • 167. !167
  • 168. !168
  • 169. !169
  • 170. !170
  • 171. !171
  • 172. !172
  • 174. !174 Except where otherwise noted, this work is licensed under