Formalizing Homogeneous Language Embeddings (LDTA at

advertisement
Formalizing Homogeneous
Language Embeddings
Tony Clark
Centre for Model Driven Software Engineering, School of Computing, Thames Valley University
tony.clark@tvu.ac.uk
http://itcentre.tvu.ac.uk/~clark/
Laurence Tratt
School of Design Engineering and Computing, Bournemouth University
laurie@tratt.net
http://tratt.net/laurie/
1
Overview
•
•
•
•
•
•
Language Factories and DSLs
An example and some properties
A language model for DSLs
The mu-calculus for DSLs
Some examples
Further work.
2
Language Factories
The ability to construct new languages by
combining precisely defined, reusable,
language components and templates.
3
Language Component
program A
block B
do C
do D
end
do E
end
A
E
B
parse
D
C
Abstract Syntax Tree
σ
σ
σ
σ
Execution Trace
σ
4
Problem Addressed
Parametric
Language
Component
Reusable
Language
Component
Questions:
• how can syntax be merged?
• how can semantics be merged?
5
• how can we specify the combination?
An Application of DSLs
let results =
lang sql:SQL[
select name,age from Customer where age > 18]
in lang html:HTML[
<TABLE>
for name,age in results do
<TR>
<TD> name </TD>
<TD> age </TD>
</TR>
</TABLE>
]
6
A
host language(G)
E
B
σ
C
evalG
σ
σ
A Model for
DSL Embedding
σ
σ
σ
V
load
unload
Z
W
w
X
Y
w
w
w
w
evalH
embedded language(H)
7
The mu-Calculus
E ::=
|
|
|
|
|
V
fun(V) E
E E
(E,E,E)
lang E:T[C]
...
variables
functions
applications
language def
language embed
8
Abstract Syntax
type Exp(T) =
Var(String)
| Lambda(String,Exp(T))
| Apply(Exp(T),Exp(T))
| (Exp(T),Exp(T),Exp(T))
| Lang(T)
| ...
9
Semantics
evalExp(eval)(s) =
case s of
... standard SECD except for...
(R:():s,e,App:c,d) ->
eval((s,e,c,d):s,e,c,d)
(I:v:s,e,App:c,d) ->
eval(v)
end
10
Loading and Unloading
lang(eval,load,unload):t[c]
is equivalent to:
translate terminal
embedded to
host state
produce embedded
terminal state
I(newState)
where newState = unload(termState,initialState)
where termState = eval(startState)
where startState = load(initialState,parse(t)(c))
where initialState = R()
install the host
state
reify the host
state
translate host
state to embedded
initial state
11
mu-calculus Embedded in Itself
Mu = Y(Exp)
evalMu = Y(evalExp)
loadMu((s,e,c,d),x) = (s,e,x:s,d)
unloadMu(s,_) = s
muL = (evalMu,loadMu,unloadMu)
fun(x)
lang muL:Mu[
fun(y)
lang muL:Mu[x + y]]
12
Let Binding: Semantics
type LetExp(T) =
Let(String,Let(T),Let(T))
| Exp(T)
type Let = Y(LetExp)
evalLetExp(eval)(s) =
case s of
(s,e,Let(n,x,b):c,d) ->
eval(s,e,x:Let(n,b):c,d)
(v:s,e,Let(n,b):c,d) ->
eval([],e[n->v],[b],(s,e,c,d))
else evalExp(eval)(s)
end
13
Let-Binding: Language Definition
type Let = Y(LetExp)
evalLet = Y(evalLetExp)
loadLet((s,e,c,d),x) = (s,e,x:c,d)
unoadLet(s,_) = s
letL = (evalLet,loadLet,unloadLet)
fun(x)
lang letL:Let[
let y = x + 1 in y ]
14
Other Examples
lang letL:Let[
let mkArray =
fun(limit)
lang arrayL:Array [
0 .. limit ]
in mkArray(100)]
lang letL:Let[
let x = ...
in lang abortL:Abort[
stop if(x > 100) ]]
15
Review and Further Work
• mu-Calculus for semantic analysis of
language embedding.
• Further work:
–
–
–
–
Parsing
Static Analysis
Logic for combining language components
Practical considerations
16
Download