<!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>Mapping FIXML to OO with Aspectual Code Generators</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Steffen Zschaler</string-name>
          <email>szschaler@acm.org</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Sobhan Yassipour Tehrani</string-name>
          <email>tehrani@kcl.ac.uk</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Department of Informatics, King's College London</institution>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2014</year>
      </pub-date>
      <abstract>
        <p>This paper provides a solution to the TTC 2014 FIXML study case. The case requires the implementation of a straightforward mapping from XML messages in the FIXML format to a set of source files implementing the schema of such a message and, optionally, an instantiation with the data from the message. There is a requirement for producing code in a range of programming languages. The biggest challenge for transformation design in this study case is that the same tag may occur in multiple places in the FIXML message, but with a different set of attributes. The generator must merge all of these occurrences into a single representation in the generated code. We demonstrate how the use of symmetric, language-aware code generators relieves the transformation developer almost entirely from considering this requirement. As a result, the transformation specifications we have written are extremely straightforward and simple. We present generation to Java and C#.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1 Introduction</title>
      <p>
        1. We use symmetric language-aware aspects [
        <xref ref-type="bibr" rid="ref6 ref7">6, 7</xref>
        ] in the implementation of our code-generation
templates, obviating almost completely the need for any special consideration of the need for
merging in schema extraction; and
      </p>
      <p>
        Our implementation is based on Epsilon [
        <xref ref-type="bibr" rid="ref2 ref3 ref4 ref5">2–5</xref>
        ] extended with symmetric-aspect support [
        <xref ref-type="bibr" rid="ref6 ref7">6, 7</xref>
        ].
      </p>
      <sec id="sec-1-1">
        <title>CG Template 1</title>
      </sec>
      <sec id="sec-1-2">
        <title>CG Template 2</title>
        <p>...</p>
      </sec>
      <sec id="sec-1-3">
        <title>CG Template n</title>
      </sec>
      <sec id="sec-1-4">
        <title>Code</title>
      </sec>
      <sec id="sec-1-5">
        <title>Slice</title>
      </sec>
      <sec id="sec-1-6">
        <title>Registry</title>
      </sec>
      <sec id="sec-1-7">
        <title>Code Slice Weaver</title>
      </sec>
      <sec id="sec-1-8">
        <title>Output Files</title>
        <p>Save to file
Generate</p>
        <sec id="sec-1-8-1">
          <title>Registry empty</title>
        </sec>
        <sec id="sec-1-8-2">
          <title>Text registered for file</title>
          <p>Weave
Generate</p>
        </sec>
        <sec id="sec-1-8-3">
          <title>Text woven</title>
          <p>Register</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>Symmetric Aspects for Code Generation</title>
      <p>
        In [
        <xref ref-type="bibr" rid="ref6 ref7">6, 7</xref>
        ], we have introduced symmetric, language-aware aspects for code-generation templates to enable
advanced modularity for code-generation templates. Detailed descriptions are in these papers, but we
give a brief summary here to simplify understanding of our solution to the TTC 2014 FIXML case.
      </p>
      <p>Figure 1 shows an overview of the infrastructure for code generation with symmetric aspects.
Crucially, results from the interpretation of code-generation templates are not directly written to a file, but
are centrally registered against the name of the file they are meant to produce. Later, all texts registered
against the same file name are merged before they are finally written to disk.</p>
      <p>
        For the merging step, we use an implementation of superimposition; specifically, FEATUREHOUSE
[
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. FEATUREHOUSE comes with our implementation by default, but other merging strategies can be
implemented and provided. FEATUREHOUSE merges two texts in two steps: First, the texts are parsed
using a coarse-grained grammar for the particular language they are written in. The aim is to extract
named entities in the code; details of the implementation (e.g., method bodies) are kept as opaque blocks
of code. Two such feature-structure trees are then combined by merging the contents of nodes of the
same name. Where these contents are opaque blocks, FEATUREHOUSE calls out to language-specific
semantic merge operators. For example, two Java method bodies are merged by inserting the second in
any place where the first mentions the special invocation of ‘origin()’.
      </p>
      <p>
        As a result, more than one code-generation template can contribute to a given file. If each template
is written to be computationally complete, they can be swapped in or out of a transformation workflow
completely independently of each other, giving great flexibility for transformation reuse, but also for
debugging. Because the templates are standard generation templates (written in EGL [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] in our case),
they can alternatively also be run by the standard EGL engine and the result written to disk directly,
making it accessible for debugging.
      </p>
      <p>Symmetric language-aware aspects for code generation have been implemented as an extension to
EGL and are available from EpsilonLabs.1</p>
      <p>1EpsilonLabs is available at http://epsilonlabs.googlecode.com/. The update site for the symmetric
aspects for code-generation plugins is http://epsilonlabs.googlecode.com/svn/trunk/org.eclipse.epsilon.egl.
symmetric_ao.updatesite.</p>
      <p>XML Model :XEMTLLToClass</p>
      <p>Class Model :CElaGsLsTSyomJ-aAOv-aCG</p>
      <p>Code : Java
&lt;&lt;instance-of&gt;&gt;
XML MetaModel : Ecore</p>
      <p>&lt;&lt;instance-of&gt;&gt;</p>
      <p>
        Class MetaModel : Ecore
We first describe the complete solution for generating Java code, before discussing the changes needed
for generating C# code.
The case specification provided a meta-model for XML documents and to be used as an intermediary
storage format for the FIXML message to be processed. We have encoded the given meta-model in Ecore
and have written a simple EOL [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] program to parse XML documents into instances of this meta-model.
This is simplified by the fact that Epsilon already comes with an XML parser, called a model driver,
exposing the contents of an XML file to model-management operations through a naming convention [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
The complete EOL program for LoadXML can be found in Listing 1.
3.1.2
      </p>
      <p>XMLToClass
As a next step, we need to extract the message schema from the concrete message given. In our
implementation, this amounts to a very straightforward copying of the XML model into a model of classes and
their attributes, differentiating between string-typed and class-typed attributes.2 The resulting model does
not describe a schema, but represents the object structure of the message given. The only change made
at this step is for the transformation to ensure that attribute names are unique within an object (although
not necessarily between different objects of the same class). This will work together with name-based
merging to ensure generation of minimal code. Additionally, we also keep track of the top-level element
in the object structure.</p>
      <p>
        This transformation is written in ETL [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] and produces instances of the meta-model shown in Fig. 3.
The code of the transformation is shown in Listings 2 and 3.
      </p>
      <p>2Here we would also do any type analysis if we were providing a solution for that additional requirement.</p>
      <sec id="sec-2-1">
        <title>DataType</title>
      </sec>
      <sec id="sec-2-2">
        <title>Model</title>
        <p>1 topClass</p>
      </sec>
      <sec id="sec-2-3">
        <title>Class</title>
        <p>*
attributes vnaalmuee :: SSttrriinngg</p>
      </sec>
      <sec id="sec-2-4">
        <title>Attribute</title>
        <p>Type type
name : String 1</p>
        <p>Note that the transformation does not merge different occurrences of the a tag of the same name into
one class definition in the class model. As a result, the model produced may contain multiple classes of
the same name. Their definitions will be merged automatically once code has been generated.
3.1.3</p>
        <p>ClassToJava
The final step of the transformation chain produces Java code from the class model. The template is
written in EGL and is extremely straightforward. It consists of a controller template (cf. Listing 4) that
instantiates a second template for every class in the model. That second template (cf. Listing 5) simply
generates a class skeleton including all attributes and references as well as a default constructor and a
constructor for the attributes and references found.</p>
        <p>Note that the name of the file to generate is derived from the name of the class in Listing 4. This
may lead to multiple versions of the same file being generated. However, the build workflow shown in
Listing 6 invokes the template using eglRegister rather than egl, thus registering all generated code
in the central registry. Only the call to eglMerge combines all code produced for a particular class.
Because elements of the same name are unified in the merging process, the requirement of the study case
is implicitly satisfied.</p>
        <p>Our code-generation platform is highly customisable. We have implemented a custom merge strategy
for attributes in Java code which can merge occurrences of an attribute of type X with occurrences of an
attribute of the same name of type List&lt;X&gt;. This has enabled us to support the generation of
collectiontyped attributes where multiple attributes / children of the same name are used in a FIXML message.</p>
        <p>We also show a modular definition of an additional feature, namely the generation of a main method
instantiating the new classes with data from the FIXML message from which they were generated. To
this end, we defined two separate code-generation templates: the first (cf. Listing 7) is a controller
template identifying the top class in a given class model and invoking the second template for this class.
The second template (cf. Listing 8) then generates an empty class body with only a main method with
a recursively constructed constructor call in it. Note that because of a limitation in Java we are not
generating custom constructors when there are more than 200 attributes in a class. This is to avoid
compilation errors, because there is a maximum number of parameters that can be passed to a constructor.
3.2</p>
        <p>Transformation to C#
C# and Java are quite similar programming languages. The syntax of both languages is based on C/C++.
They are both object-oriented and strongly typed languages. In general, the overall structure of C# and
Java are almost identical for this FIXML transformation. The only real difference is the need to use
‘using System;’ at the beginning of each file to allow for the use of upper-case ‘String’ as a type name.</p>
        <p>
          Because neither the class model nor the XML model contain any information specific to the target
language, the early transformations can be kept unchanged. Only the final code-generation needs to be
adjusted by 1) using the C#-specific template and 2) changing the language handler for the invocation
of eglMerge to csharp. Language handlers encapsulate language-specific information like the
featurestructure grammar and semantic merge-operators for unparsed blocks. A C# language handler did not
exist in the original version of symmetric aspects for code generation as presented in [
          <xref ref-type="bibr" rid="ref6 ref7">6, 7</xref>
          ]. However,
as the architectures of the generation infrastructure and the underlying FEATUREHOUSE system are
designed to be extensible, adding one was a matter of a few minutes.
4
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Conclusions and Outlook</title>
      <p>We have presented a solution to the TTC 2014 FIXML case using symmetric aspects for code generation.
The key feature of our solution is that our implementation could be largely built language independently
and with almost no concern for schema derivation issues. We have not implemented the generator for
C++. However, this could be easily realised following the same ideas by adding an appropriate set of
code-generator templates.</p>
      <p>Tables 1 and 2 show the results for the various metrics requested in the case specification.</p>
    </sec>
    <sec id="sec-4">
      <title>A Transformation Implementation Examples</title>
      <p>Listing 1: LoadXML implementation in EOL
generateFor ( XMLDoc . root );
operation generateFor (e : Element ) : XML ! XMLNode {
var node : XML ! XMLNode = new XML ! XMLNode ;
node . tag = e. tagName ;
if (e. getAttributes (). length &gt; 0) {
for ( idx in Sequence {1.. e. getAttributes (). length }) {
var attr = e. getAttributes (). item ( idx - 1);
var xmlAttr : XML ! XMLAttribute = new XML ! XMLAttribute ;
node . attributes = node . attributes -&gt; including ( xmlAttr );
xmlAttr . name = attr . nodeName ;
xmlAttr . value = attr . nodeValue ;
}</p>
      <p>}
return node ;
for ( elt in e. children ) {
node . subnodes = node . subnodes</p>
      <p>-&gt; including ( generateFor ( elt ));</p>
      <p>Listing 2: XMLtoClass implementation in ETL
pre {
var STRING_TYPE : Classes ! DataType = new Classes ! DataType ;
STRING_TYPE . name = " String ";
}
}</p>
      <p>}
rule NodeToClass
transform s : XML ! XMLNode
to t : Classes ! Class {
t. name = s. tag ;
var uniqueID = new Map ;
for ( attr in s. attributes ) {
var newAttr = attr . equivalent ();
newAttr . name = newAttr . name . getUniqueVersion ( uniqueID );
t. attributes = t. attributes -&gt; including ( newAttr );
for ( elt in s. subnodes ) {
var attr : Classes ! Attribute = new Classes ! Attribute ;
t. attributes = t. attributes -&gt; including ( attr );
attr . name = elt . tag . getUniqueVersion ( uniqueID );
attr . type ::= elt ;
rule AttrToAttr
transform s : XML ! XMLAttribute
to t : Classes ! Attribute {
t. name = s. name ;
t. value = s. value ;
t. type = STRING_TYPE ;
post {
var mdl : Classes ! Model = new Classes ! Model ;
mdl . topClass ::= getTopNode ();
return resultSet . random ();
}
else {</p>
      <p>uniqueID . put (self , 1);
}
return self + result ;</p>
      <p>Listing 3: XMLtoClass implementation in ETL (ctd.)
operation getTopNode () : XML ! XMLNode {
var resultSet = XML ! XMLNode . all ;
for ( node in XML ! XMLNode . all ) {</p>
      <p>resultSet = resultSet -&gt; excludingAll ( node . subnodes );
operation String getUniqueVersion ( uniqueID ) : String {
var result : Integer = 0;
if ( uniqueID . containsKey ( self )) {
result = uniqueID . get ( self );
uniqueID . put (self , result + 1);</p>
      <p>Listing 4: ClassToJava controller template
[%
for (cl in Model ! Class . all ()) {
var t := TemplateFactory . load (' JavaOneClass . egl ');
t. populate (' currentClass ', cl );
t. generate ( tgtdir + cl. name + '. java ');</p>
      <p>Listing 5: ClassToJava per-class template
package [%= pck %];
public class [%= currentClass . name %] {
[%
for ( prop : Model ! Attribute in currentClass . attributes ) {
%]
private [%= prop . type . name %] [%= prop . name %] =
[% if ( prop . type . isKindOf ( Model ! DataType )) {
%] " [%= prop . value %]" [%
} else {
%] new [%= prop . type . name %] ()[%}%];
%]
}</p>
      <p>[%
public [%= currentClass . name %]() {}
[% if (( not currentClass . attributes -&gt; isEmpty ()) and
// Java is not happy with too many parameters
( currentClass . attributes -&gt; size () &lt;= 200)) {%]
public [%= currentClass . name %]([%
var first = true ;
for ( prop : Model ! Attribute in currentClass . attributes ) {
if ( not first ) {%] , [%}
else { first = false ;}
%][%= prop . type . name %] [%= prop . name %][%
}%]) {
[%
for ( prop : Model ! Attribute in</p>
      <p>currentClass . attributes ) {
%] this .[%= prop . name %] = [%= prop . name %];
[%}%]</p>
      <p>Listing 6: Build workflow
&lt;target name =" generate - java " depends =" generate - general "&gt;
&lt; epsilon . eglRegister</p>
      <p>src =" transformations / java / GenerateMain . egl "&gt;
&lt;model ref =" classes " as=" Model "/&gt;
&lt; parameter name =" tgtdir " value ="${ generate - tgt }/ java /"/&gt;
&lt; parameter name =" pck " value ="${ tgtsubdir }. java "/&gt;
&lt;/ epsilon . eglRegister &gt;
&lt; epsilon . eglRegister</p>
      <p>src =" transformations / java / ToJava . egl "&gt;
&lt;model ref =" classes " as=" Model "/&gt;
&lt; parameter name =" tgtdir " value ="${ generate - tgt }/ java /"/&gt;
&lt; parameter name =" pck " value ="${ tgtsubdir }. java "/&gt;
&lt;/ epsilon . eglRegister &gt;
&lt; epsilon . eglMerge &gt;
&lt;file &gt;
&lt; include name ="${ generate - tgt }/ java /*. java " /&gt;
&lt; superimpose artifactHandler =" java15 " /&gt;
&lt;/ file &gt;
&lt;/ epsilon . eglMerge &gt;
&lt;/ target &gt;</p>
      <p>Listing 7: Java main method controller template
for ( mdl in Model ! Model ) {
var t := TemplateFactory . load (' JavaMainMethod . egl ');
t. populate (' currentClass ', mdl . topClass );
t. generate ( tgtdir + mdl . topClass . name + '. java ');</p>
      <p>Listing 8: Java main method template
package [%= pck %];
public class [%= currentClass . name %] {
public static void main ( String [] args ) {
[%= currentClass . name %] top</p>
      <p>= [%= currentClass . generateConstructorCall ()%];
operation Model ! Class generateConstructorCall () : String {
var result : String = " new " + self . name + " (";
// Java doesn 't like too many parameters
if ( self . attributes -&gt; size () &lt;= 200) {
var first = true ;
for ( attr in self . attributes ) {
if ( not first ) {</p>
      <p>result = result + ", ";
result = result + ")";
return result ;</p>
    </sec>
    <sec id="sec-5">
      <title>Metrics</title>
      <p>Complexity
Execution time
Abstraction level</p>
      <p>It is not entirely clear what is meant by an operator or
an entity/feature reference in this context, so the below
values are approximations:
LoadXML – 35
XMLToClass – 61
ClassToJava – 12 (controller template) + 34
(perclass template) + 11 (main-method controller
template) + 29 (main-method generation) = 86
ClassToCS – 12 (controller template) + 31 (per-class
template) + 11 (main-method controller
template) + 26 (main-method generation) = 80
The following times (in milliseconds) were
measured when running all test cases on
a TravelMate laptop with i5 CPU
running at 2.4GHz and 4GB of main memory.</p>
      <p>Stage Minimum Average Maximum
LoadXML 78 299 1062
XMLToClass 31 304 1451
ClassToCSharp 63 1929 7317</p>
      <p>ClassToJava 218 1713 5647
It should be noted that the times shown can vary
substantially between runs of the experiment set. The
code-generation stage takes the most time, which is
in line with the fact that the main processing happens
here. Further breakdown of the timing for Java
generation reveals the following for the same run as above:</p>
      <p>Stage Minimum Average Maximum
RegisterJava 109 819 2636</p>
      <p>MergeJava 109 894 3011
Medium as this is a declarative-imperative solution.
Accuracy Syntactic correctness (cf. Table 3) and semantic
preservation are achieved. Uniqueness of attribute
names is guaranteed by XMLToClass.</p>
      <p>Development effort Approx. 3.5 person hours for Java; approx. 0.5
additional person hours for C#; approx. 1 person hour for
a generalised build script (optional).</p>
      <p>Fault tolerance High – the transformation accurately reports errors in
the XML files.</p>
      <p>Modularity Below are approximate values making assumptions
about the meaning of ’rule’:
LoadXML – 1 1=1 = 0
TestCase 3: [epsilon.xml.loadModel] [Fatal Error]
test3.xml:25:3: The element type "Order"
must be terminated by the matching end-tag
"&lt;/Order&gt;".</p>
      <p>TestCase 7: [epsilon.xml.loadModel] [Fatal Error]
test7.xml:14:12: The element type "Sndr"
must be terminated by the matching end-tag
"&lt;/Sndr&gt;".</p>
      <p>TestCase 8: [epsilon.xml.loadModel] [Fatal Error]
test8.xml:19:10: The element type "Hdr"
must be terminated by the matching end-tag
"&lt;/Hdr&gt;".</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>Sven</given-names>
            <surname>Apel</surname>
          </string-name>
          , Christian Ka¨stner &amp; Christian
          <string-name>
            <surname>Lengauer</surname>
          </string-name>
          (
          <year>2009</year>
          ): FEATUREHOUSE:
          <string-name>
            <surname>Language-Independent</surname>
          </string-name>
          ,
          <source>Automated Software Composition. In Stephen Fickas</source>
          , Joanne Atlee &amp; Paola Inverardi, editors:
          <source>Proc. 31st Int'l Conf. on Software Engineering (ICSE'09)</source>
          , IEEE Computer Society, pp.
          <fpage>221</fpage>
          -
          <lpage>231</lpage>
          , doi:10.1109/ICSE.
          <year>2009</year>
          .
          <volume>5070523</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <surname>Dimitrios</surname>
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Kolovos</surname>
          </string-name>
          , Richard F. Paige &amp; Fiona
          <string-name>
            <surname>Polack</surname>
          </string-name>
          (
          <year>2006</year>
          ):
          <article-title>The Epsilon Object Language (EOL)</article-title>
          .
          <source>In Arend Rensink &amp; Jos Warmer</source>
          , editors:
          <source>Proc. ECMDA-FA</source>
          <year>2006</year>
          , LNCS 4066, Springer, pp.
          <fpage>128</fpage>
          -
          <lpage>142</lpage>
          , doi:10.1007/11787044 11.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <surname>Dimitrios</surname>
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Kolovos</surname>
          </string-name>
          , Richard F. Paige &amp;
          <string-name>
            <surname>Fiona A.C. Polack</surname>
          </string-name>
          (
          <year>2008</year>
          ):
          <article-title>The Epsilon Transformation Language</article-title>
          . In Antonio Vallecillo, Jeff Gray &amp; Alfonso Pierantonio, editors:
          <source>Proc. 1st Int'l. Conf. on Theory and Practice of Model Transformations (ICMT'08), Lecture Notes in Computer Science 5063</source>
          , Springer-Verlag.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Dimitrios</surname>
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Kolovos</surname>
          </string-name>
          ,
          <string-name>
            <surname>Louis M. Rose</surname>
            ,
            <given-names>James</given-names>
          </string-name>
          <string-name>
            <surname>Williams</surname>
          </string-name>
          , Nicholas Matragkas &amp;
          <string-name>
            <surname>Richard F. Paige</surname>
          </string-name>
          (
          <year>2012</year>
          )
          <article-title>: A Lightweight Approach for Managing XML Documents with MDE Languages</article-title>
          . In Antonio Vallecillo, JuhaPekka Tolvanen, Ekkart Kindler, Harald Sto¨rrle &amp; Dimitris Kolovos, editors:
          <source>Proc. 8th European Conf. on Modelling Foundations and Applications (ECMFA'12)</source>
          ,
          <source>LNCS 7349</source>
          , Springer, pp.
          <fpage>118</fpage>
          -
          <lpage>132</lpage>
          , doi:10.1007/978- 3-
          <fpage>642</fpage>
          -31491-9
          <fpage>11</fpage>
          . Available at http://dx.doi.org/10.1007/978-3-
          <fpage>642</fpage>
          -31491-9_
          <fpage>11</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <surname>Louis</surname>
            <given-names>M.</given-names>
          </string-name>
          <string-name>
            <surname>Rose</surname>
          </string-name>
          , Richard F. Paige, Dimitrios S. Kolovos &amp;
          <article-title>Fiona A</article-title>
          .
          <string-name>
            <surname>Polack</surname>
          </string-name>
          (
          <year>2008</year>
          ):
          <article-title>The Epsilon Generation Language</article-title>
          . In Ina Schieferdecker &amp; Alan Hartman, editors:
          <source>Proc. 4th European Conf. on Model Driven Architecture (ECMDA-FA'08)</source>
          , Springer, pp.
          <fpage>1</fpage>
          -
          <lpage>16</lpage>
          , doi:10.1007/978-3-
          <fpage>540</fpage>
          -69100-6
          <fpage>1</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>Steffen</given-names>
            <surname>Zschaler</surname>
          </string-name>
          &amp; Awais
          <string-name>
            <surname>Rashid</surname>
          </string-name>
          (
          <year>2011</year>
          )
          <article-title>: Symmetric Language-Aware Aspects for Modular Code Generators</article-title>
          .
          <source>Technical Report TR-11-01</source>
          , King's College London, Department of Informatics.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>Steffen</given-names>
            <surname>Zschaler</surname>
          </string-name>
          &amp; Awais
          <string-name>
            <surname>Rashid</surname>
          </string-name>
          (
          <year>2011</year>
          )
          <article-title>: Towards Modular Code Generators Using Symmetric LanguageAware Aspects</article-title>
          .
          <source>In: Proceedings of the 1st International Workshop on Free Composition, FREECO '11</source>
          ,
          <string-name>
            <surname>ACM</surname>
          </string-name>
          , New York, NY, USA, pp.
          <volume>6</volume>
          :
          <fpage>1</fpage>
          -
          <issue>6</issue>
          :5, doi:10.1145/2068776.2068782. Available at http://doi.acm.
          <source>org/10</source>
          . 1145/2068776.2068782.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>