<!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>Taxonomy of Flexible Linguistic Commitments</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Universiteit van Amsterdam</institution>
          ,
          <country country="NL">The Netherlands</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Beside strict linguistic commitments of models to metamodels, documents to schemata, programs to grammars and activities to protocols, we often require or crave more flexible commitments. Some of such types of flexible commitments are well-understood and even formalised, others are considered harmful. In this paper, we make an attempt to classify these types from the language theory point of view, provide concrete examples from software language engineering for each of them and estimate usefulness and possible harm.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        In software language engineering people often speak of linguistic commitment,
structural commitment or commitment to grammatical structure [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Examples
include:
      </p>
      <p>Any form of flexibility in such commitments is either not present or not
considered. In this paper we propose to model it explicitly and classify its forms
into several categories, varying in usefulness and the ability to lead to robust
systems or to catastrophes.</p>
      <p>The paper is organised as follows: §2 state the problem more clearly and
formally. Based on that, §3 introduces three kinds of flexible language
variations. Then, §4 classifies and explains all flexibly committing mappings within
the framework. §5 proposes five kinds of streamlining helper mappings around
the same language. §6 gives preliminary outlook at higher order manipulations
such as composition of mappings,extension/restriction of them and constructing
inverse functions. §7 concludes the paper.</p>
    </sec>
    <sec id="sec-2">
      <title>Problem Statement</title>
      <p>Consider a mapping f ∶ L1 → L2 which domain is a software language L1 and
which codomain is a software language L2 (they can be the same in many cases,
but let us look at the general case). Following the principle of least surprise, we
could assume that f is surjective and total (i.e., its image fully coincides with
its codomain and its preimage with its domain) so that it maps every element of
L1 to some element of L2 and that every element of L2 is reachable. By flexible
linguistic commitment we will understand a situation when this expectation is
violated.
3</p>
    </sec>
    <sec id="sec-3">
      <title>Variations in Software Languages</title>
      <p>
        Consider three variants based on a language L:
◇ By L we will denote a language that is strictly smaller than L: it has more
constraints and less elements. Committing to a subset of a language is in
general not that harmful and means limited applicability of the tool or a
mapping.
◇ By L^ we will denote a similarly strict superset of L which has then more
elements and less constraints. Committing to a bigger language than intended is
considered good practice in some areas that value robustness highly [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ].
However, here we consider only “accidental” violations that extend the intended
language in a way that preserves the semantics of the language instances up
to heuristics that make sense for the problem domain.
◇ By L~ we will denote another superset of L that refers to semantic changes —
instances from L~ are not just outside L, but they also allow interpretations
that are incorrect according to the semantics of L. The existence of L~ is the
main cause for critique on robustness guidelines [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
      </p>
      <p>In order to stay universally applicable, we consider all definitions to be
specific to the problem domain of the software language (without loss of generality,
so called general purpose programming and modelling languages are assumed to
belong to problem domains of Turing-complete algorithms and the
everythingis-a-model paradigm respectfully). For example, unclosed tags are indicators
of HÆTM L since the HTML language is meant to be processed in a soft and
extremely flexible way, yet they are indicators of XËM L in most cases except
for the absolutely trivial ones — say, one could argue that an XML document
which is well-formed except one place with the construction like &lt;a&gt;&lt;b&gt;&lt;/a&gt; is
in XÆM L since it can be treated as &lt;a&gt;&lt;b/&gt;&lt;/a&gt;. However, even &lt;a&gt;&lt;b&gt;c&lt;/a&gt;
is already in XËM L since it has two intuitively good resolutions: &lt;a&gt;&lt;b/&gt;c&lt;/a&gt;
and &lt;a&gt;&lt;b&gt;c&lt;/b&gt;&lt;/a&gt;. Yet, in a subdomain of XML that deals with exclusively
empty or complex elements but never with cdata or mixed content, &lt;a&gt;&lt;b&gt;c&lt;/a&gt;
would also belong to XÆML′.
: : : → L2</p>
      <p>L1 → : : :
correct program
wrong language
o
tg: : : → L2 partial applicability
n
i
app: : : → L^2 antirobustness
m</p>
      <p>~
: : : → L2
fault introduction</p>
      <p>mapping from</p>
      <p>L1 → : : :
non-surjectivity
conservativeness
perfect
assumed
liberality
^
L1 → : : :
~</p>
      <p>L1 → : : :
robustness</p>
      <p>overrobustness
fault recovery overrecovery
fault tolerance overtolerance</p>
      <p>semirecovery
shotgun effect ilginngouraisntcice</p>
      <p>◇ f ∶ L1 → L2 (correct program, wrong language)</p>
      <p>Some mappings that look like having flexible linguistic commitments, are
in fact (possibly) correct mappings working on a different language than
expected. This kind of “flexibility” is easily fixable by correcting the
specification.
◇ f ∶ L1 → L2 (partial mapping, limited applicability)</p>
      <p>Theoretically this scenario corresponds to the notion of partial function. In
practice it can be well disguised in a wrapper that extends f to L1 ∖L1 to
behave like an identity function. If this is not done, this kind of flexibility is not
flexible at all: it actually means that in order to use f , one needs to normalise
its inputs in a more strict way than documented. In certain cases it
manifests itself as a works-on-my-machine antipattern when such undocumented
constraints concern configuration management and deployment details.</p>
      <p>^
◇ f ∶ L1 → L2 (antirobustness, ungratefulness)</p>
      <p>If robustness (see below) is to expect less and provide more, then
antirobustness is its exact opposite: the demands on the input in this case are
higher than officially specified, and even when they are met, the output is
ungratefully relaxed.</p>
      <p>~
◇ f ∶ L1 → L2 (fault introduction)</p>
      <p>If antirobust mappings can damage syntactic conformity, this variant can
also do semantic damage. Such a tool is flexible beyond reasonable, it is
inherently faulty: while holding surprisingly high expectations on its inputs,
it generates outputs that are outright wrong.
◇ f ∶ L1 → L2 (non-surjective mapping, conservativeness)</p>
      <p>Concervative mappings that transform a language instance into an instance
with an even stronger linguistic commitment, are not surjective. For cases
of L1 = L2 they are called language reductions and represent a form of
traditional normalisers without extra tolerance for input violations. Most
code generators are conservative: they cover the entire input language but
there exist possible target language programs that will never be generated.
Classic canonical normal forms in grammarware and databases are also this
kind of conservative mappings: they are proven to exist for all inputs and
infer standardised provably equivalent counterparts of them. Formally, this
is one of the best kinds of flexibility.
◇ f ∶ L1 → L2 (assumed / perfect)</p>
      <p>
        We list this form of commitment for the sake of completeness, but in fact
it represents no flexibility: this is the standard commitment to grammatical
structure [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], more or less precisely defined and precisely obeyed.
      </p>
      <p>^
◇ f ∶ L1 → L2 (liberality)</p>
      <p>In mathematics, a function is under no circumstances allowed to return a
value outside its codomain, but from our point of view this variant is a
conceptual sibling of the conservativeness discussed above which corresponds
to the lack of surjectivity. For the case of L1 = L2 this is called language
extension: and it may be intentional — consider a situation of a coupled
transformation sequence representing language evolution (if the language is
backwards compatible, it will only contain language preserving and
extending operators) or some kind of refinement/enrichment plan that recognises
patterns of language use and transforms them into constructs of some more
sophisticated language.</p>
      <p>~
◇ f ∶ L1 → L2 (fault introduction)</p>
      <p>
        What classifies mappings of this category is the lack of anticipation: it was
probably meant to be a L1 → L2 mapping, and as it turns out, it does not
work correctly on unanticipated instances from L ∖ L. One of the typical
examples is refactoring engines that claim to cover some programming
language but in fact work correctly only on its subset while yielding irregular
results whenever certain concurrency or subtyping patterns are involved [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
      </p>
      <p>^
◇ f ∶ L1 → L2 (robustness)</p>
      <p>
        This is precisely the model of the “be conservative in what you do, be liberal
in what you expect from others”, also known as Postel’s Robustness
Principle [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], or at least its harmless implementations. The input language is
extended to a safe superset of L1, but the output language is limited to a
subset of L2. Many normalisers work this way, accepting mostly valid entities
of a language and mapping them onto a strict subset of the same language.
For example, BibSLEIGH [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], a project involving a large JSON database,
has a normaliser that traverses all JSON files, including those that have
trailing commas in lists or dictionaries, as well as those with naïve quoting, and
transforms each of them into an LRJ file (Lexically Reliable Json) which
is basically valid JSON with extra guarantees of one key-value pair per line
and lines being sorted lexicographically.
      </p>
      <p>^
◇ f ∶ L1 → L2 (recovery)</p>
      <p>
        A mapping that accepts slightly more than obligatory yet remains true to its
output language, represents error recovery: in the simplest case of L1 = L2
this may be the only purpose of the mapping, but it does not have to be. For
example, consider notation-parametric grammar recovery, a technique that
takes a human-written error-containing language document and a definition
of the format it is supposed to have, and yields a well-formed grammar
extracted from it [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. Most of its heuristics are such mappings. Approximate
pattern matching [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] and semiparsing [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] also belong to the same group, as
do screen-scraping libraries like Beautiful Soup [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ].
      </p>
      <p>^ ^
◇ f ∶ L1 → L2 (tolerance)</p>
      <p>
        In the terminology of negotiated mappings, the previous kind of flexible
commitment represented adaptation through adjustment; this one is
adaptation through tolerance [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. Such a mapping still needs to cope with the
unexpected outputs, but has an option of propagating the unexpected parts
further down the pipeline instead of fixing them.
      </p>
      <p>^ ~
◇ f ∶ L1 → L2 (shotgun effect)</p>
      <p>
        This kind of mapping has been identified in the technological space of
internet security and named “shotgun parsing” there [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. A shotgun parser is a
program that is meant to check its input for linguistic commitment and
sanitise it, yet in the interest of performance optimisations does not perform a
thorough check and limits itself to fundamentally flawed approaches such as
regular means of treating context-free languages or using plain string
substitution for escaping; as a result, the system becomes vulnerable to malevolent
input (comment bombs, SQL injections, etc). Every shotgun parser in the
pipeline increases the span of possible treatments of data, hence the shotgun
metaphor.
      </p>
      <p>~
◇ f ∶ L1 → L2 (overrobustness)</p>
      <p>
        A few paragraphs above we reintroduced robustness as input type
contravariance and output type covariance. Overrobustness does the same but crosses
the syntax-semantics border and hence becomes dangerously ambiguous,
nondeterministic and in general error-prone. Many examples of
overrobustness leading to security bugs were given by Meredith Patterson et al. at
http://langsec.org [
        <xref ref-type="bibr" rid="ref2 ref9">2,9</xref>
        ].
      </p>
      <p>~
◇ f ∶ L1 → L2 (overrecovery)</p>
      <p>
        Overrecovery is a process of applying heuristic-based fixes to semantically
incorrect language instances with the goal to return to the intended
output language. Some aggressive heuristics like parenthesis matching from
notation-parametric grammar recovery [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] fall into this category, as well
as desperate matches in semiparsing [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ].
      </p>
      <p>~ ^
◇ f ∶ L1 → L2 (overtolerance, semirecovery)</p>
      <p>Overtolerance is a form of harmful error handling when semantic errors in
the input are presumably fixed, but the output is still not always guaranteed
to be syntactically correct.</p>
      <p>~ ~
◇ f ∶ L1 → L2 (ignorance)</p>
      <p>The ultimate form of flexible linguistic commitment is complete linguistic
ignorance: our inputs can be broken beyond any hope of unambiguous
repair, and the outputs are not much better in that respect. All lexical analysis
: : : → L</p>
      <p>L → : : :</p>
      <p>4
canoniser
id
^
L → : : :</p>
      <p>1
normaliser</p>
      <p>3
codifier
~
L → : : :
∼
*
regulator</p>
      <p>
        ≃
calibrator
methods belong to this category and are still being often use due to their
extreme speed, ease of development and virtually unlimited flexibility, despite
limited expressiveness and abundant false positives and negatives. Some
migration and analysis projects of considerable size have been reported being
completed with language ignorant lexical methods [
        <xref ref-type="bibr" rid="ref10 ref5">5,10</xref>
        ].
5
      </p>
    </sec>
    <sec id="sec-4">
      <title>Streamlining Mappings</title>
      <p>Before we try to compose flexibly committed mappings and consider higher order
combinators, we need to introduce a special subcategory of streamlining
mappings that help us “get back” to L or even L whenever we deviate. In particular,
we have a need for the following five (summarised on Table 2:
◇ Canoniser (4 ∶ L → L) has a normal (precise) commitment to L and produces
a strict subset of it. Typically this is some kind of canonical normal form
that makes sense for the chosen technological space; if it is strictly canonical,
there is usually a proof of its uniqueness up to L.</p>
      <p>^
◇ Codifier (3 ∶ L → L) is flexible with its input because it applies certain rules
for recovery which are applied until the output conforms to all expectations
of L.
◇ Normaliser (1 ∶ L^ → L) implements a classic Postel-style normalisation
scheme that we have briefly discussed before: it is liberal with respect to
its input and conservative with respect to its output. In our formalisation
it also means that 1 ≡ 4 ○ 3 (a normaliser is equivalent to the superposition
of a codifier and a canoniser), and indeed, any normaliser can be
conceptually studied as a composition of two parts implementing the liberality and
the conservativeness accordingly. We will consider superposition of flexibly
committing functions in the next section in more detail.
◇ Calibrators (≃ ∶ L~ → L) and regulators (*∼ ∶ L~ → L) can be decomposed
similarly in various ways, but the key when considering them is remembering
that the main distinction between L^ and L~ is that L^ ∖ L is anticipated
and L~ ∖ L is not. Hence, when something is not anticipated, it cannot be
casually accounted for by an automated streamliner. In practice developing
calibrators and regulators requires the same steps as developing codifiers
and normalisers, with additional effort dedicated to testing and documenting
recovery heuristics, which are usually unreliable.</p>
      <p>L′ → : : :
ie dL → : : :
d
lp n
p coL^′ → : : :
;a se
f</p>
      <p>L~′ → : : :</p>
      <p>: : : → L
f ○ g, if L ⊆ L′
f ○ 4 ○ g
f ○ g
f ○ g
f ○ g
g; applied first
: : : → L : : : → L^
f ○ 4 ○ g
f ○ 1 ○ g</p>
      <p>~
: : : → L
f ○ *∼ ○ g
f ○ g
f ○ g
f ○ g</p>
      <p>f ○ 3 ○ g f ○ ≃ ○ g
f ○ g, if L^ ⊆ L′ f ○ ≃ ○ g</p>
      <p>^
f ○ 3 ○ g
f ○ 3 ○ g f ○ ≃ ○ g
For every possible combination of input and output types (strictly speaking,
for any input type since output type is irrelevant), a restriction on L is defined
straightforwardly as a function which returns whatever the original function
would have returned, for all inputs from the restricted set, and is underfined
otherwise. An extension of a function deliberately committing to a subset of the
intended language, on the other hand, cannot be defined in a general fashion.
Hence, for any f which preimage is L, L^ or L~, we get a f SL for free, but the
extension f SL for f ∶ L → L′ is, generally speaking, unknown.</p>
      <p>A more interesting observation is that restriction can affect the flexibility
of the linguistic commitment to the output language as well: for example, if
f ∶ L^1 → L2, then f SL1 ∶ L → L2 or possibly f SL1 ∶ L → L2. This has bad
consequences on calculating inverses of restrictions.
Due to the nature of our formalisation that considers preimages and images
instead of domains and codomains, all functions that map between L1, L1, L^1 and
L2, L2, L^2, have straightforward inverse mappings. Their non-unique existence is
guaranteed (the proof is a direct consequence of the definitions of a premiga and
^ ^
an image). For example, for any f ∶ L1 → L2 there is at least one f −1 ∶ L2 → L1.
Inverses of restrictions can be more desirable, but less reliable, since there is no
guarantee that for an arbitrary f ∶ L^1 → L^2, the image of f SL1 (L1) ∩ L2 ≠ ∅.</p>
      <p>However, the following compositions are also universally safe (variations of
L2 correspond to variations of L in the table):
⊚ ∶ (L2 → L3) → (L1 → L2) → (L1 → L3)</p>
      <p>^
⊚ ∶ (L2 → L3) → (L1 → L2) → (L1 → L3)</p>
      <p>~
⊚ ∶ (L2 → L3) → (L1 → L2) → (L1 → L3)</p>
      <p>^
⊚ ∶ (L2 → L3) → (L1 → L2) → (L1 → L3)</p>
      <p>~
⊚ ∶ (L2 → L3) → (L1 → L2) → (L1 → L3)</p>
      <p>The result type of such compositions given above is a possible
overapproximation, because technically we combine g with f SL2 or f SL2 , not with f itself,
so it is possible for f ⊚ g with the codomain L3 to have image L3.</p>
      <p>The rest often require streamliners, with two special cases stemming from the
fact that in our notation L^ expresses any superset of L and not a particular one.
Thus, it can be the case that L2 ⊆ L′2 and then ⊚ ∶ (L′2 → L3) → (L1 → L2) →
(L1 → L3) is expressible with a simple superposition: f ⊚ g = f ○ g, but otherwise
we need an L′2-canoniser to glue them together: f ⊚ g = f ○ 4 ○ g. Similarly to the
safe case discussed above, the image of such composition can be L3 if L2 ≠ L′2.
7</p>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>
        This paper is an attempt to investigate Postel’s Robustness Principle (“be
conservative in what you do, be liberal in what you expect from others”) [
        <xref ref-type="bibr" rid="ref1 ref7">7,1</xref>
        ], in
particular to follow the Postel’s Principle Patch (“be definite about what you
accept”) [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] and the formal language theoretical approach to computer (in)security,
in the general software language engineering view (not limited to internet
protocols and even data languages). The result was a taxonomy of several
families of language mappings depending on the inclusion relations between their
domains and preimages, as well as codomains and images. The taxonomy
(Table 1) contains two forms of precise commitment and several forms of harmful
and profitable flexible commitments. Streamlining mappings (Table 2), mapping
superpositions (Table 3) and other details of manipulating mappings with such
flexible commitments, have also been considered. This classification is a
refinement with respect to any previously existing approach, and provides means to
identify safe combinations of mappings and streamliners. Formal treatment of
tolerance [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] remains future work, and in general a categorical approach should
provide even more solid foundation than a set theoretical one, which can also be
refined further to yield interesting and useful properties.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>E. Allman.</surname>
          </string-name>
          <article-title>The Robustness Principle Reconsidered</article-title>
          .
          <source>Communications of the ACM</source>
          ,
          <volume>54</volume>
          (
          <issue>8</issue>
          ):
          <fpage>40</fpage>
          -
          <lpage>45</lpage>
          , Aug.
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>S.</given-names>
            <surname>Bratus</surname>
          </string-name>
          and
          <string-name>
            <given-names>M. L.</given-names>
            <surname>Patterson</surname>
          </string-name>
          .
          <article-title>Shotgun Parsers in the Cross-hairs</article-title>
          .
          <source>In Brucon</source>
          ,
          <year>2012</year>
          . http://langsec.org.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>M.</given-names>
            <surname>Gouseti</surname>
          </string-name>
          .
          <article-title>A General Framework for Concurrency Aware Refactorings</article-title>
          .
          <source>Master's thesis</source>
          , UvA, Mar.
          <year>2015</year>
          . http://dare.uva.nl/en/scriptie/502196.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>P.</given-names>
            <surname>Klint</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Lämmel</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Verhoef</surname>
          </string-name>
          .
          <article-title>Toward an Engineering Discipline for Grammarware</article-title>
          .
          <source>ACM ToSEM</source>
          ,
          <volume>14</volume>
          (
          <issue>3</issue>
          ):
          <fpage>331</fpage>
          -
          <lpage>380</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>S.</given-names>
            <surname>Klusener</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Lämmel</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Verhoef</surname>
          </string-name>
          . Architectural Modifications to Deployed Software.
          <source>Science of Computer Programming</source>
          ,
          <volume>54</volume>
          :
          <fpage>143</fpage>
          -
          <lpage>211</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>V.</given-names>
            <surname>Laurikari</surname>
          </string-name>
          . TRE. http://github.com/laurikari/tre,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <given-names>J.</given-names>
            <surname>Postel. DoD Standard Internet</surname>
          </string-name>
          <article-title>Protocol</article-title>
          .
          <source>RFC 0760</source>
          ,
          <year>1980</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>L.</given-names>
            <surname>Richardson</surname>
          </string-name>
          . Beautiful Soup. http://www.crummy.com/software/ BeautifulSoup,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <given-names>L.</given-names>
            <surname>Sassaman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. L.</given-names>
            <surname>Patterson</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Bratus</surname>
          </string-name>
          .
          <article-title>A Patch for Postel's Robustness Principle</article-title>
          .
          <source>IEEE Security and Privacy</source>
          ,
          <volume>10</volume>
          (
          <issue>2</issue>
          ):
          <fpage>87</fpage>
          -
          <lpage>91</lpage>
          , Mar.
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>D.</given-names>
            <surname>Spinellis. Differential Debugging</surname>
          </string-name>
          .
          <source>IEEE Software</source>
          ,
          <volume>30</volume>
          (
          <issue>5</issue>
          ):
          <fpage>19</fpage>
          -
          <lpage>21</lpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <given-names>P.</given-names>
            <surname>Stevens</surname>
          </string-name>
          . Bidirectionally Tolerating Inconsistency:
          <article-title>Partial Transformations</article-title>
          .
          <source>In FASE</source>
          , volume
          <volume>8411</volume>
          <source>of LNCS</source>
          , pages
          <fpage>32</fpage>
          -
          <lpage>46</lpage>
          . Springer,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <given-names>V.</given-names>
            <surname>Zaytsev</surname>
          </string-name>
          .
          <article-title>Notation-Parametric Grammar Recovery</article-title>
          . In A. Sloane and S. Andova, editors,
          <source>LDTA. ACM DL</source>
          ,
          <year>June 2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <given-names>V.</given-names>
            <surname>Zaytsev</surname>
          </string-name>
          .
          <article-title>Formal Foundations for Semi-parsing</article-title>
          . In S. Demeyer,
          <string-name>
            <given-names>D.</given-names>
            <surname>Binkley</surname>
          </string-name>
          , and F. Ricca, editors,
          <source>CSMR-WCRE ERA</source>
          , pages
          <fpage>313</fpage>
          -
          <lpage>317</lpage>
          . IEEE, Feb.
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <given-names>V.</given-names>
            <surname>Zaytsev</surname>
          </string-name>
          .
          <source>Negotiated Grammar Evolution. JOT</source>
          ,
          <volume>13</volume>
          (
          <issue>3</issue>
          ):1:
          <fpage>1</fpage>
          -
          <lpage>22</lpage>
          ,
          <year>July 2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <given-names>V.</given-names>
            <surname>Zaytsev</surname>
          </string-name>
          .
          <article-title>BibSLEIGH: Bibliography of Software Language Engineering in Generated Hypertext</article-title>
          . In A. H. Bagge, editor,
          <source>SATToSE</source>
          , pages
          <fpage>59</fpage>
          -
          <lpage>62</lpage>
          ,
          <year>July 2015</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>