160 likes | 245 Views
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
E N D
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/
Overview • Language Factories and DSLs • An example and some properties • A language model for DSLs • The mu-calculus for DSLs • Some examples • Further work.
Language Factories The ability to construct new languages by combining precisely defined, reusable, language components and templates.
Language Component program A block B do C do D end do E end A E parse B D C Abstract Syntax Tree σ σ σ σ σ Execution Trace
Problem Addressed Reusable Language Component Parametric Language Component • Questions: • how can syntax be merged? • how can semantics be merged? • how can we specify the combination?
An Application of DSLs let results = langsql:SQL[ select name,agefrom Customer where age > 18] inlanghtml:HTML[ <TABLE> forname,agein results do <TR> <TD> name </TD> <TD> age </TD> </TR> </TABLE> ]
A host language(G) A Model for DSL Embedding E B evalG σ σ σ σ σ σ C V load unload Z W w w w w w evalH Y X embedded language(H)
The mu-Calculus E ::= V variables | fun(V) E functions | E E applications | (E,E,E) language def | lang E:T[C] language embed | ...
Abstract Syntax type Exp(T) =Var(String) | Lambda(String,Exp(T)) | Apply(Exp(T),Exp(T)) | (Exp(T),Exp(T),Exp(T)) | Lang(T) | ...
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
Loading and Unloading translate terminal embedded to host state lang(eval,load,unload):t[c] is equivalent to: I(newState) where newState = unload(termState,initialState) where termState = eval(startState) where startState = load(initialState,parse(t)(c)) where initialState = R() produce embedded terminal state install the host state translate host state to embedded initial state reify the host state
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) langmuL:Mu[ fun(y) langmuL:Mu[x + y]]
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
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 ]
Other Examples langletL:Let[let mkArray = fun(limit) langarrayL:Array [ 0 .. limit ]in mkArray(100)] langletL:Let[ let x = ... in langabortL:Abort[ stop if(x > 100) ]]
Review and Further Work • mu-Calculus for semantic analysis of language embedding. • Further work: • Parsing • Static Analysis • Logic for combining language components • Practical considerations