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