<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Veri able composition of language extensions</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Computer Science and Engineering University of Minnesota</institution>
          ,
          <addr-line>Minneapolis, MN</addr-line>
          ,
          <country country="US">USA</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Domain-speci c languages o er a variety of advantages, but their implementation techniques have disadvantages that sometimes prevent their use in practice. Language extension o ers a potential solution to some of these problems, but remains essentially unused in practice. It is our contention that the main obstacle to adoption is the lack of any assurance that the compiler composed of multiple independent language extensions will work without the need for additional modi cations, or at all. We propose to solve this problem by requiring extensions to independently pass a composition test that will ensure that any such extensions can be safely composed without \glue code," and we propose to demonstrate that interesting extensions are still possible that satisfy such a test.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        Domain-speci c languages (DSLs) come with a variety of reasonably well-known
advantages and disadvantages [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Some of these disadvantages do not seem to
be inherent to DSLs in general, but are a consequence of the way they are
implemented. In particular, many implementation techniques lack or poorly support
composition, meaning multiple DSLs cannot easily be used together to solve a
problem.
      </p>
      <p>
        To be more precise about what we mean by language composition, we will
use some of the classi cation and notation of Erdweg, Giarrusso, and Rendel [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
The notation H / E represents a host language H composed with a language
extension E, speci cally crafted for H. Another composition operator L1 ]g L2
denotes the composition of two distinct languages with \glue code" g. To permit
only the / form of language composition (\language extension") is not su cient.
With H, H / E1, and H / E2, we are left with no option for composing all three,
without modifying one of the extensions to have the form (H / E1) / E2 (or vice
versa.) However, the ]g form of language composition (\language uni cation")
is also insu cient for our purposes. The problem with this form of composition
is that the \glue code" g necessary to perform this composition is essentially an
admission that the composition is broken and must be repaired. (Though it is
still interesting that the composition can be repaired.)
      </p>
      <p>What we seek is a composition method L1 ]; L2, that is, language uni cation
without needing any glue code (g = ;.) This may seem impossible in general,
but there is hope in special cases, such as when both languages are extensions
to a common host: (H / E1) ]; (H / E2). Here we are tasked with resolving only
con icts between E1 and E2, while the host language H is shared. We will say
that a DSL implementation technique supports composable language extension
if it is capable of composition of the form H / (E1 ]; E2). We further require that
the technique provides some assurance that the resulting composed language will
work as intended, and is not simply broken.</p>
      <p>The goal of this work is to build a DSL implementation tool and demonstrate
that it satis es the following criteria:
{ Supports composable language extension, as de ned above.
{ Permits introduction of new syntax.
{ Permits introduction of new static analysis on existing syntax.
{ Capable of generating good, domain-speci c error messages.
{ Capable of complex translation, such as domain-speci c optimizations.</p>
      <p>In Section 2 we provide some background on the tools we will be making
use of in pursuit of this goal. In Section 2.1 we survey some of the other tools
for implementing domain-speci c languages. In Section 3 we propose the work
we plan for this thesis. In Section 3.1 we outline work beyond the scope of this
thesis.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Background</title>
      <p>
        The rst major obstacle to supporting composable language extension is to
allow composition of syntax extensions. Although context-free grammars are easily
composed, the resulting composition may no longer be deterministic, or
otherwise amenable to parser generation. Copper [
        <xref ref-type="bibr" rid="ref15">15, 20</xref>
        ] is an LR(1) parser generator
that supports syntax composition of the form H / (E1 ]; E2) so long as each
H / E individually satisfy some conditions of its modular determinism
analysis. Assuming we require extensions to satisfy this analysis, Copper o ers one
solution to the syntax side of the problem of supporting composable language
extension.
      </p>
      <p>
        Attribute grammars [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] are a formalism for describing computations over
trees. Trees formed from an underlying context-free grammar are attributed with
synthesized and inherited attributes, allowing information to ow, respectively,
up and down the tree. Each production in the grammar speci es equations that
de ne the synthesized attributes on its corresponding nodes in the tree, as well as
the inherited attributes on the children of those nodes. These equations de ning
the value of an attribute on a node may depend on the values of other attributes
on itself and its children. Attribute grammars trivially support both the
\language extension" and \language uni cation" modes of language composition, by
simply aggregating declarations of nonterminals, productions, attributes, and
semantic equations.
      </p>
      <p>There is a natural con ict between introducing new syntax and static
analysis, referred to as the \expression problem1." Although normally formulated in
1 http://homepages.inf.ed.ac.uk/wadler/papers/expression/expression.txt
terms of data types, it applies equally well to abstract syntax trees, and thus
has consequences for language extension. If one language extension introduces
new syntax, and another a new analysis, the combination of the two extensions
would be missing the implementation of this analysis for this syntax. Either the
composition is then broken, glue code must be written to bridge this con ict,
or there must be some mechanism to accurately and automatically generate this
glue code.</p>
      <p>Attribute grammars are capable of solving the expression problem by
manually providing \glue code" that provides for evaluating new attributes on new
productions. However, the expression problem can also be automatically resolved
without glue code for attribute grammars that include forwarding [19]. An
extension production that forwards to a \semantically equivalent" tree in the host
language can evaluate new attributes introduced in other extensions via that
host language tree, where the attribute will have de ning semantic equations.</p>
      <p>
        Although forwarding removes the need for the \glue code" necessary to
resolve the expression problem, there are other ways in which a composition
of attribute grammars may cause con icts. Attribute grammars have a
\wellde nedness" property that, roughly speaking, ensures each attribute can
actually be evaluated. However, although H, H / E1 and H / E2 may be well-de ned,
there is no guarantee that H / (E1 ]; E2) will also be well-de ned. As part of this
thesis, we have developed a modular well-de nedness analysis [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] that provides
this guarantee. This analysis checks each H / E individually, and ensures that
the composition H / (E1 ]; E2) will be well-de ned.
2.1
      </p>
      <sec id="sec-2-1">
        <title>Related work</title>
        <p>
          Domain-speci c languages are traditionally implemented as an \external" DSL,
and therefore incapable of composition with each other. Internal (or Embedded
DSLs) are those implemented as a \mere" library in a suitable host language [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ].
Internal DSLs are interesting in part because they permit the kind of composition
we are interested in. However, they come with many drawbacks. For one, not
all languages are practical choices for internal DSLs, including many that are in
popular use, because the range of possible syntax is seriously limited by the host
language. Further, in their simplest form, internal DSLs cannot easily perform
domain-speci c analysis, or complex translation.
        </p>
        <p>
          One way of making internal DSLs capable of domain-speci c analysis is to
take advantage of complex embeddings into the host language's type system.
AspectAG [21] and Ur/Web [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ] are internal DSLs that take this approach to
enforcing certain properties. The drawback to these approaches is the error
messages: they are reported as type errors in the host language's interpretation of
the types. In the worst case, understanding these error messages requires not
just a deep understanding of the property being checked, but also the particular
implementation and embedding of that property into the host language's type
system.
        </p>
        <p>
          One way to improve the ability of internal DSLs to generate code is to take
advantage of meta-programming facilities in the language, like LISP macros, or
C++ templates. Racket [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ] o ers sophisticated forms of macros to enable this
kind of translation. However, the static analysis capabilities of these macros are
quite limited, though they are able to generate surprisingly good error messages
for a macro system. (Especially surprising for those used to C++ template error
messages.)
        </p>
        <p>
          There are several systems for specifying languages that enable language
extension and uni cation, as described in the introduction. JastAdd [
          <xref ref-type="bibr" rid="ref4 ref7">7, 4</xref>
          ], Kiama [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ],
and UUAG [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ] are such systems based upon attribute grammars. SugarJ [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ] is
a recent system built upon SDF [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ] and Stratego [22]. Rascal [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ] is a
metaprogramming language with numerous high-level constructs for analyzing and
manipulating programs. Helvetia [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ] is a dynamic language based upon Smalltalk
with language extension capabilities. However each of these systems requires that
the composition of multiple language extensions may need to be repaired with
glue code, and they otherwise provide little guarantee the composition will work.
As a result, they do not support composable language extension, in our sense.
        </p>
        <p>MPS [23] is a meta-programming environment that leans heavily on an
object-oriented view of abstract syntax, and consequently struggles with
expression problem in its support for composition. Consequently, the host language
limits the possible analyses over syntax that are possible. Many useful language
extensions do not necessarily need new analysis over the host language, however,
as macro systems for dynamic languages already demonstrate.
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Proposal</title>
      <p>
        One component of this thesis has already been mentioned: our modular
wellde nedness analysis for attribute grammars [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. This work is fully described
elsewhere, but we will summarize it here. We say that an attribute grammar is
e ectively complete if, during attribute evaluation, no attribute is ever demanded
that lacks a de ning semantic equation. This analysis operates on each H / E
individually, and provides an assurances that the resulting H /(E1];E2) will also
have this property, without the need to explicitly check this composed language.
To do this, the analysis is necessarily conservative about what extensions pass.
Roughly speaking, extensions must satisfy the following requirements:
{ Extensions must not alter the ow types of host language synthesized
attributes. That is, they cannot require new (extension) inherited attributes be
supplied in order to evaluate existing (host language) synthesized attributes.
{ New productions introduced in extensions must forward.
{ The ow types for new attributes introduced by an extension must account
for the potential need to evaluate forward equations before they can be
evaluated.
      </p>
      <p>
        This modular well-de nedness analysis, together with Copper's modular
determinism analysis, o ers a potential path towards composable language
extension. Silver [
        <xref ref-type="bibr" rid="ref10">18, 10</xref>
        ] is an attribute grammar-based language with support for
Copper, for which we have implemented our modular well-de nedness analysis.
As the remainder of this thesis, we propose to evaluate whether this tool is truly
capable of composable language extension. This is not a given, because the range
of potential language extensions has been restricted:
{ Forwarding requires all extensions' dynamic semantics be expressible in terms
of the host language. We do not anticipate this restriction being a burden, as
the host languages we're interested in extending are Turing-complete with
rich IO semantics.
{ Copper's analysis places restrictions on the syntax that can be introduced by
extensions, relative to their host language. Again, since the host languages
we are interested in extending often have highly complex concrete syntax
already, we expect these restrictions will be a light burden.
{ Silver's analysis places restrictions on how information can ow around
abstract syntax trees. Again, however, this is relative to the host language
implementation, which we expect to o er support for rich kinds of
information ow already.
      </p>
      <p>In light of these potential restrictions on the kinds of extensions that can be
speci ed in Silver, we wish to validate each of our goals:
{ The analyses themselves accomplish the goal of supporting composable
language extension.
{ We will need to implement at least two new extensions to the syntax.
{ We will need to implement at least one new extension to static analysis.
{ That static analysis extension should demonstrate the ability to generate
good, domain-speci c error messages.
{ One of the extensions should involve either complex translation, require
domain-speci c optimizations, or have at least stringent e ciency
requirements, to demonstrate the approach has little to no runtime overhead.</p>
      <p>We propose to build a host language speci cation for C in Silver. C is an
ambitious choice, but choosing a rich, practical language of independent design
is necessary to evaluate whether the analyses' restrictions are practical, as they
depend on the host language. To this speci cation of C, we propose to build
language extensions that will meet the above requirements. These should ideally
be language extensions that already exist in the literature, so that the changes to
their design or syntax that are necessary to satisfy the analyses can be evaluated.</p>
      <p>From this we hope to learn:
{ How to better design extensible host language implementations, to support
the development of interesting extensions. Many of the limitations imposed
by the analyses depend upon the host language implementation more so than
on the host language itself.
{ Ways in which Silver itself may need to be extended to help specify the host
language and extensions. For example, proper aggregation of error messages
in the extensions could be ensured with language features speci c to error
message aggregation.
{ Whether the restrictions still permit interesting and practical language
extensions.
{ Informally, whether the resulting extended languages are useful. We intend
for our colleagues to make use of these extended languages, providing some
feedback in this area, though we do not intend to perform an empirical
investigation.
3.1</p>
      <sec id="sec-3-1">
        <title>Future work</title>
        <p>Beyond the scope of this thesis, there lie many more problems that must be
solved to bring language extension to practicality.</p>
        <p>First, host languages must be developed in Silver before they can be
extended, and extensions can only be composed for a common host language, so
fragmentation must be kept to a minimum to avoid splitting apart the
ecosystem. High enough quality implementations of host languages for production use
remains future work.</p>
        <p>Second, numerous less daunting engineering issues would also need resolving.
No obstacles to composing language extensions at runtime exist for Silver and
Copper, but the feature has yet to be fully implemented. Further, the build
process for making use of an extended compiler in large software projects must
be worked out.</p>
        <p>Third, a variety of other tooling must also be composable. Languages
extensions must result not only in composed compilers, but also composed debuggers
and integrated development environments. Abandoning these tools is not an
option for practical use. We do not intend to directly address this problem in this
thesis, though concurrent work for such tools in Silver is ongoing.</p>
        <p>Finally, although these analyses ensure con icts do not arise from the parser
or attribute evaluator, it is possible that con icts could arise in some other
fashion. Certainly we can imagine blatantly wrong code, like suppressing all
error messages from subtrees. But the formulation of composable proofs of the
compiler's correctness would complete our understanding the problem posed by
composable language extension.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Conclusion</title>
      <p>We believe that no existing DSL implementation tool satis es all ve goals listed
in the introduction: support composable language extension, allow extension
to both and static analysis, provide good domain-speci c error messages, and
allow complex translation requirements. These goals are motivated by the desire
to ensure that the users of language extensions can be certain they can draw
on whatever high-quality extensions they need, without fear of breaking their
compiler.</p>
      <p>We have developed an analysis that ensures Silver meets the goal of
supporting composable language extension, and we have implemented this analysis. We
intend to develop an extensible speci cation of a popular and practical language,
C, and we intended to demonstrate that practical language extensions to it are
possible that satisfy this analysis. We believe this will demonstrate that Silver
satis es all ve goals listed in the introduction for an ideal DSL implementation
technique.
18. Van Wyk, E., Bodin, D., Krishnan, L., Gao, J.: Silver: an extensible attribute
grammar system. Scinece of Computer Programming (2009), accpeted, In Press
19. Van Wyk, E., de Moor, O., Backhouse, K., Kwiatkowski, P.: Forwarding in
attribute grammars for modular language design. In: Proc. 11th Intl. Conf. on
Compiler Construction. LNCS, vol. 2304, pp. 128{142 (2002)
20. Van Wyk, E., Schwerdfeger, A.: Context-aware scanning for parsing extensible
languages. In: Intl. Conf. on Generative Programming and Component Engineering,
(GPCE). ACM Press (October 2007)
21. Viera, M., Swierstra, S.D., Swierstra, W.: Attribute grammars y rst-class: How
to do aspect oriented programming in haskell. In: Proc. of 2009 International
Conference on Functional Programming (ICFP'09) (2009)
22. Visser, E.: Stratego: A language for program transformation based on rewriting
strategies. System description of Stratego 0.5. In: Rewriting Techniques and
Applications (RTA'01). LNCS, vol. 2051, pp. 357{361. Springer-Verlag (2001)
23. Voelter, M.: Language and ide modularization, extension and composition with
mps. In: GTTSE 2011 (2011)</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Baars</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Swierstra</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Loh</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          : Utrecht University AG system manual, http://www.cs.uu.nl/wiki/Center/AttributeGrammarSystem.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Chlipala</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Ur: statically-typed metaprogramming with type-level record computation</article-title>
          .
          <source>In: PLDI</source>
          ,
          <year>2010</year>
          . pp.
          <volume>122</volume>
          {
          <fpage>133</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2010</year>
          ), http://doi.acm.
          <source>org/10</source>
          .1145/1806596.1806612
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Deursen</surname>
            ,
            <given-names>A.v.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Klint</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Visser</surname>
          </string-name>
          , J.:
          <article-title>Domain-speci c languages: An annotated bibliography</article-title>
          .
          <source>ACM SIGPLAN Notices</source>
          <volume>35</volume>
          (
          <issue>6</issue>
          ),
          <volume>26</volume>
          {36 (Jun
          <year>2000</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Ekman</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hedin</surname>
          </string-name>
          , G.:
          <article-title>Rewritable reference attributed grammars</article-title>
          .
          <source>In: Proc. of ECOOP '04 Conf</source>
          . pp.
          <volume>144</volume>
          {
          <issue>169</issue>
          (
          <year>2004</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Erdweg</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Giarrusso</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rendel</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>Language composition untangled</article-title>
          .
          <source>In: LDTA</source>
          ,
          <year>2012</year>
          (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Erdweg</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rendel</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          , Kastner,
          <string-name>
            <given-names>C.</given-names>
            ,
            <surname>Ostermann</surname>
          </string-name>
          ,
          <string-name>
            <surname>K.</surname>
          </string-name>
          :
          <article-title>Sugarj: library-based syntactic language extensibility</article-title>
          .
          <source>In: OOPSLA 2011</source>
          . pp.
          <volume>391</volume>
          {
          <fpage>406</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2011</year>
          ), http://doi.acm.
          <source>org/10</source>
          .1145/2048066.2048099
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Hedin</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Magnusson</surname>
          </string-name>
          , E.:
          <article-title>JastAdd - an aspect oriented compiler construction system</article-title>
          .
          <source>Science of Computer Programming</source>
          <volume>47</volume>
          (
          <issue>1</issue>
          ),
          <volume>37</volume>
          {
          <fpage>58</fpage>
          (
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Heering</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hendriks</surname>
            ,
            <given-names>P.R.H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Klint</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Rekers</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>The syntax de nition formalism sdf</article-title>
          .
          <source>SIGPLAN Not</source>
          .
          <volume>24</volume>
          (
          <issue>11</issue>
          ),
          <volume>43</volume>
          {75 (Nov
          <year>1989</year>
          ), http://doi.acm.
          <source>org/10</source>
          .1145/ 71605.71607
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Hudak</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Building domain-speci c embedded languages</article-title>
          .
          <source>ACM Computing Surveys</source>
          <volume>28</volume>
          (
          <year>4es</year>
          ) (
          <year>1996</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Kaminski</surname>
          </string-name>
          , T.,
          <string-name>
            <surname>Van Wyk</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          :
          <article-title>Integrating attribute grammar and functional programming language features</article-title>
          .
          <source>In: Proceedings of 4th the International Conference on Software Language Engineering (SLE</source>
          <year>2011</year>
          ). LNCS, vol.
          <volume>6940</volume>
          , pp.
          <volume>263</volume>
          {
          <fpage>282</fpage>
          . Springer (July
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Kaminski</surname>
          </string-name>
          , T.,
          <string-name>
            <surname>Van Wyk</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          :
          <article-title>Modular well-de nedness analysis for attribute grammars (</article-title>
          <year>2012</year>
          ),
          <source>accepted SLE</source>
          <year>2012</year>
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Klint</surname>
          </string-name>
          , P., van der Storm, T.,
          <string-name>
            <surname>Vinju</surname>
          </string-name>
          , J.:
          <article-title>Rascal: a domain speci c language for source code analysis and manipulation</article-title>
          .
          <source>In: Proc. of Source Code Analysis and Manipulation (SCAM</source>
          <year>2009</year>
          )
          <article-title>(</article-title>
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Knuth</surname>
            ,
            <given-names>D.E.</given-names>
          </string-name>
          :
          <article-title>Semantics of context-free languages</article-title>
          .
          <source>Mathematical Systems Theory</source>
          <volume>2</volume>
          (
          <issue>2</issue>
          ),
          <volume>127</volume>
          {
          <fpage>145</fpage>
          (
          <year>1968</year>
          ),
          <article-title>corrections in 5(</article-title>
          <year>1971</year>
          ) pp.
          <volume>95</volume>
          {
          <fpage>96</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Renggli</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          , G^rba, T.,
          <string-name>
            <surname>Nierstrasz</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          :
          <article-title>Embedding languages without breaking tools</article-title>
          .
          <source>In: ECOOP 2010</source>
          . pp.
          <volume>380</volume>
          {
          <fpage>404</fpage>
          . Springer (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Schwerdfeger</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Van Wyk</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          :
          <article-title>Veri able composition of deterministic grammars</article-title>
          .
          <source>In: Proc. of ACM SIGPLAN Conference on Programming Language Design and Implementation</source>
          (PLDI). ACM Press (
          <year>June 2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Sloane</surname>
            ,
            <given-names>A.M.:</given-names>
          </string-name>
          <article-title>Lightweight language processing in kiama</article-title>
          . In: Proc.
          <article-title>of the 3rd summer school on Generative and transformational techniques in software engineering III (GTTSE 09)</article-title>
          . pp.
          <volume>408</volume>
          {
          <fpage>425</fpage>
          . Springer (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Tobin-Hochstadt</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>St-Amour</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Culpepper</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Flatt</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Felleisen</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Languages as libraries</article-title>
          .
          <source>In: PLDI 2011</source>
          . pp.
          <volume>132</volume>
          {
          <fpage>141</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA (
          <year>2011</year>
          ), http://doi.acm.
          <source>org/10</source>
          .1145/1993498.1993514
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>