Object Grammars
Compositional & Bidirectional Mapping Between Text and Graphs Tijs van der Storm, William R. Cook, Alex Loh
Monday, October 1, 12
Object Grammars Compositional & Bidirectional Mapping Between - - PowerPoint PPT Presentation
Object Grammars Compositional & Bidirectional Mapping Between Text and Graphs Tijs van der Storm , William R. Cook, Alex Loh Monday, October 1, 12 http://www.enso-lang.org/ Monday, October 1, 12 Models Monday, October 1, 12 Text to
Compositional & Bidirectional Mapping Between Text and Graphs Tijs van der Storm, William R. Cook, Alex Loh
Monday, October 1, 12
Monday, October 1, 12
Monday, October 1, 12
Opened Closed Locked close
unlock lock
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
Object Grammar
Monday, October 1, 12
Monday, October 1, 12
P ::= [Point] "(" x:int "," y:int ")"
Monday, October 1, 12
P ::= [Point] "(" x:int "," y:int ")"
Constructor
Monday, October 1, 12
P ::= [Point] "(" x:int "," y:int ")"
Constructor Field binding
Monday, October 1, 12
P ::= [Point] "(" x:int "," y:int ")"
Constructor Field binding Built-in primitives
Monday, October 1, 12
P ::= [Point] "(" x:int "," y:int ")"
Constructor Field binding Built-in primitives
class Point x: int y: int
The schema
Monday, October 1, 12
P ::= [Point] "(" x:int "," y:int ")"
Constructor Field binding Built-in primitives
class Point x: int y: int
The schema
Monday, October 1, 12
P ::= [Point] "(" x:int "," y:int ")"
Constructor Field binding Built-in primitives
class Point x: int y: int
The schema
Monday, October 1, 12
P ::= [Point] "(" x:int "," y:int ")"
Constructor Field binding Built-in primitives
class Point x: int y: int
The schema
Monday, October 1, 12
Exp ::= [Binary] lhs:Exp op:"+" rhs:Exp | [Binary] lhs:Exp op:"*" rhs:Exp | [Const] value:int | "(" Exp ")"
class Exp class Binary < Exp
lhs: Exp rhs: Exp class Const < Exp value: int
Monday, October 1, 12
Exp ::= [Binary] lhs:Exp op:"+" rhs:Exp | [Binary] lhs:Exp op:"*" rhs:Exp | [Const] value:int | "(" Exp ")"
Both + and * become Binary objects
class Exp class Binary < Exp
lhs: Exp rhs: Exp class Const < Exp value: int
Monday, October 1, 12
Exp ::= [Binary] lhs:Exp op:"+" rhs:Exp | [Binary] lhs:Exp op:"*" rhs:Exp | [Const] value:int | "(" Exp ")"
Both + and * become Binary objects Parentheses don’t introduce objects
class Exp class Binary < Exp
lhs: Exp rhs: Exp class Const < Exp value: int
Monday, October 1, 12
class Exp class Binary < Exp
lhs: Exp rhs: Exp class Const < Exp value: int
Term ::= [Binary] lhs:Term op:"+" rhs:Fact | Fact Fact ::= [Binary] lhs:Fact op:"*" rhs:Prim | Prim Prim ::= [Const] value:int | "(" Term ")"
Refactored grammar for disambiguation
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
Opened Closed Locked close
unlock lock
Monday, October 1, 12
M ::= [Machine] "start" \start:</states[it]> states:S* S ::= [State] "state" name:sym out:T* T ::= [Transition] "on" event:sym "go" to:</states[it]>
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start Opened state Opened
state Closed
state Locked
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
O p e n e d C l
e d L
k e d c l
e
e n u n l
k l
k
( a )
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
O p e n e d C l
e d L
k e d c l
e
e n u n l
k l
k
( a )
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
O p e n e d C l
e d L
k e d c l
e
e n u n l
k l
k
( a )
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
O p e n e d C l
e d L
k e d c l
e
e n u n l
k l
k
( a )
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
O p e n e d C l
e d L
k e d c l
e
e n u n l
k l
k
( a )
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
O p e n e d C l
e d L
k e d c l
e
e n u n l
k l
k
( a )
Monday, October 1, 12
Object path to find the start state with name it
M ::= [Machine] "start" \start:</states[it]> states:S* S ::= [State] "state" name:sym out:T* T ::= [Transition] "on" event:sym "go" to:</states[it]>
Monday, October 1, 12
Monday, October 1, 12
start at the root navigate into states use the parsed identifier as key
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]> to:</states[“Closed”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]> to:</states[“Closed”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]> to:</states[“Closed”]>
Monday, October 1, 12
start Opened state Opened
state Closed
state Locked
:Machine name: "Opened" :State name: "Closed" :State name: "Locked" :State event: "close" : Transition event: "open" :Transition event: "lock" : Transition event: "unlock" :Transition from
in to in to in from
from states states
from to states machine
in to start
start:</states[“Opened”]> to:</states[“Closed”]> to:</states[“Opened”]> to:</states[“Locked”]> to:</states[“Closed”]>
Monday, October 1, 12
Monday, October 1, 12
Grammar Schema Stencil Auth Command Expr Web XML Path Controller
Monday, October 1, 12
Monday, October 1, 12
Monday, October 1, 12