<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Supporting Diverse Notations in MPS&apos; Projectional Editor</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Markus</forename><surname>Voelter</surname></persName>
							<email>voelter@acm.org</email>
							<affiliation key="aff0">
								<orgName type="institution">independent/itemis</orgName>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Sascha</forename><surname>Lisson</surname></persName>
							<email>lisson@itemis.de</email>
							<affiliation key="aff0">
								<orgName type="institution">independent/itemis</orgName>
							</affiliation>
						</author>
						<title level="a" type="main">Supporting Diverse Notations in MPS&apos; Projectional Editor</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">77F87BCEA62592FD3B97F10A05531890</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-25T06:56+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>To be able to build effective DSLs, these DSLs must not just use language concepts that are aligned with their respective domain, but also use notations that correspond closely to established domain notations -and those are often not purely textual or graphical. The underlying language workbench must support these notations, and combining different notations in a single editor must be supported as well in order to support the coherent definitions of systems that use several DSLs. In this paper we provide an overview over the notations supported by JetBrains MPS. MPS is a language workbench that uses a projectional editor, which, by its very nature, can deal with many different notational styles, including text, prose, math tables and graphics. The various supported notations are illustrated with examples from real-world systems.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>The GEMOC 2014 workshop description states: To cope with complexity, modern software-intensive systems are often split in different concerns, which serve diverse stakeholder groups and thus must address a variety of stakeholder concerns. These different concerns are often associated with specialized description languages and technologies, which are based on concern-specific problems and solution concepts. In particular, these different concerns also require different notations. Ideally, these notations are closely aligned with existing domain-specific notations used by the stakeholders. However, such existing notations are not necessarily just text: they use forms, diagrams, mathematical symbols, a mix of prose and structure or combinations of those. Representing such diverse notations faithfully requires a high degree of flexibility in the kinds of editors that can be built with the language workbench used to create the languages.</p><p>Projectional editing (see Section 2) allows creating editors that can use a wide variety of notations, including the ones mentioned above. In particular, it can also mix these notations seamlessly, leading to a more faithful representation of existing domain languages in tools. JetBrains MPS is one of the leading projectional editors, and this paper describes its capabilities in terms of notational flexibility. Contribution This paper provides an overview over the notational styles currently supported by MPS. For each style we discuss why it is useful, where it is being used as well as some details about how to define the respective editors.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Availability of the Code</head><p>JetBrains MPS is open source software available from http://jetbrains.com/mps. Also, those editor facilities that are separate plugins to MPS are open source software and their repositories are indicated in each case. The examples shown in this paper are mostly based on mbeddr <ref type="bibr" target="#b0">[1]</ref> and are open source as well. The screenshots in Figures <ref type="figure" target="#fig_6">7, 9</ref> and 10 are taken from a commercial tool currently being developed by Siemens PLM software; however, the underlying editor facilities are all open source as well. Structure In the next section we provide a brief overview over MPS' projectional editor and show briefly how to implement regular text editors. Section 3 introduces the fundamental notations supported by MPS and Section 4 discusses other useful features of the MPS editor. We conclude the paper with a brief discussion and summary in Section 5.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Projectional Editing in MPS</head><p>What is Projectional Editing? In parser-based editors users type sequences of characters into a text buffer. The buffer is parsed to check whether the sequence of characters conforms to a grammar. The parser ultimately builds an abstract syntax tree (AST), which contains the relevant structure of the program, but omits syntactic details. Subsequent processing (linking, type checks, transformation) is based on the AST. Modern IDEs (re-)parse the concrete syntax while the user edits the code, continuously maintaining an up-to-date AST in the background that reflects the code in the editor's text buffer. However, even in this case, this AST is created by a parser-driven transformation from the source text.</p><p>A projectional editor does not rely on parsers. As a user edits a program, the AST is modified directly. Projection rules are used to create a representation of the AST with which the user interacts, and which reflects the resulting changes. No parser-based transformation from concrete to abstract syntax is involved. This approach is well-known from graphical editors: when editing a UML diagram, users do not draw pixels onto a canvas, and a "pixel parser" then creates the AST. Rather, the editor creates an instance of uml.Class when a user drops a class. A projection engine renders the class as a rectangle. As the user edits the program, program nodes are created as instances of language concepts. Programs are stored using a generic tree persistence format (such as XML).</p><p>The projectional approach can be generalized to work with any notation, including textual. A code-completion menu lets users create instances based on a text string entered in the editor called the alias. The aliases allowed in any given location depend on the language definition. Importantly, every next text string is recognized as it is entered, so there is never any parsing of a sequence of text strings. In contrast to parser-based editors, where disambiguation is performed by the parser after a (potentially) complete program has been entered, in projectional editors disambiguation is performed by the user as he selects a concept from the code-completion menu. Once a node is created, it is never ambiguous, irrespective of its syntax : every node points to its defining concept. Every program node has a unique ID, and references between program elements are represented as references to the ID. These references are established during program editing by directly selecting reference targets from the code-completion menu; the references are persistent. This is in contrast to parser-based editors, where a reference is expressed as a string in the source text, and a separate name resolution phase resolves the target AST element after the text has been parsed.</p><p>Projectional editing has two advantages. First, it supports flexible composition of languages because the ambiguities associated with parsers cannot happen in projectional editors. We do not discuss this aspect in this paper and refer the reader to <ref type="bibr" target="#b1">[2]</ref>. The other advantage of projectional editors is that, since no parsing is used, the program notation does not have to be parseable and a wide range of notations can be used. This paper focusses on this aspect. Traditionally, projectional editors have also had disadvantages relative to editor usability and infrastructure integration; those are discussed in <ref type="bibr" target="#b2">[3]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Defining a Simple Editor</head><p>In order for the reader to better understand the explanations in Sections 3 and 4, this section briefly introduces the MPS structure and editor definitions. MPS' meta model is similar to EMF Ecore <ref type="bibr" target="#b3">[4]</ref>. Language concepts (aka meta classes) declare children (single or lists), references and primitive properties. Concepts can extend other concepts or implement concept interfaces; subtype polymorphism is supported. Programs are represented as instances of concepts, called nodes. Each concept also defines one or more editors. These are the projection rules that determine the notation of instance nodes in the program. Editor definitions consist of cells arranged in various layouts. A cell can be seen as an atomic element of an editor definition. As an example, let us consider the if statement in C. Its structure is defined as follows:</p><formula xml:id="formula_0">concept IfStatement extends Statement alias: if children: condition: Expression[1] elsePart: StatementList[0..1] thenPart: StatementList[1] elseIfs: ElseIfPart[0..n]</formula><p>Fig. <ref type="figure" target="#fig_0">1</ref> shows the editor definition for the IfStatement concept. At the top level, it consits of a collection cell [-.. -] which aligns a sequence of additional cells in some particular way -a linear sequence in this case. The sequence starts with the constant (keyword) if and a pair or parentheses. Between those, the editor projects the condition expression; the % sign is used to refer to children of the current concept. The thenPart follows, and since it is a StatementList, it comes with its own curly braces. The (-... -) collection captures the list of else if parts, if any. The ElseIfPart comes with its own editor which is embedded here. Finally, there is an optional set of cells (represented by the ? and a condition expression that is not shown) that contains the else keyword as well as the elsePart child. A flag (not shown) determines that the else part is shown on a new line, leading to the expected representation of if statements.  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">Notations</head><p>This section discusses the notations supported by MPS. For each we provide a rationale, an example and a hint on how to build editors that use the style.</p><p>Textual Notations The first notation supported by MPS has been textual notations. Notations used by programming languages such as Java, C or HTML can be represented easily. The example in the previous section shows how to create editors for textual notations. The backbone is the indent layout collection cell which can deal flexibly with sequences of nodes, newlines and indentation.</p><p>Mathematical Symbols A plugin <ref type="bibr" target="#b4">[5]</ref> supports mathematical notations. The plugin comes with a set of new layout primitives (cell types) that enable typical mathematical notations such as fraction bars, big symbols (sum or product), roots and all kinds of side decorations (as used in abs or floor). The plugin contributes only the editor cells so they can be integrated into arbitrary languages. So far they have been integrated into C (Fig. <ref type="figure" target="#fig_1">2</ref>) and an insurance DSL. Fig. <ref type="figure" target="#fig_2">3</ref> shows the definition of the sum editor. It uses the new primitive LOOP which can be used for everything that has a big symbol as well as things above, below and right of the symbol. The particular symbol is defined separately and referenced from the editor definition. The LOOP cell has three slots (lower, upper and body) into which child nodes can be added. The Sum expression defines children upper, body and lower, which are mapped to these slots. These slots can contain arbitrary editor cells, not just child collections: the lower slot contains a collection that projects the name property, an equals sign and the lower child.</p><p>Tables Tables can be used to represent collections of structured data or to represent two-dimensional concerns. For example, Fig. <ref type="figure">4</ref> shows a state machine Fig. <ref type="figure">4</ref>. A state machine represented as a table; also shows nested headers.</p><p>rendered as a table. Another example used in mbeddr <ref type="bibr" target="#b0">[1]</ref> is decision tables (essentially two nested if statements).</p><p>Tables come in several flavors. For example, a row-oriented table has a fixed set of columns and a variable list of rows. Users can add rows, but the columns are prescribed by the language definition. In contrast, the state machine shown in Fig. <ref type="figure">4</ref> is a cell-oriented table: users can add new columns (events), new rows (states) and new entries in the content cells (transitions). The language for defining tabular editors <ref type="bibr" target="#b5">[6]</ref> takes these different categories into account. For example, the definition for the state machine uses queries over the state machine model to determine the set of columns and rows. The contents for the transition cells are also established via queries: each transition is a child of its source state and references the triggering event. Since both columns and rows can be added (or deleted) by the user, callbacks for adding and deleting both are implemented. The code below shows part of the table implementation for state machines. Prose with Embedded Code One characteristic of projectional editors is that the language structure strictly determines the structure of the code that can be written in the editor. While this is useful for code, it does not work for prose. Hence, an MPS plugin <ref type="bibr" target="#b6">[7]</ref> supports "free text editing" in MPS: all the usual selection and editing actions known from text editors are supported. The resulting text is stored as a sequence of IWord nodes. By creating new concepts that implement the IWord concept interface, other specific nodes can be inserted into the sequence of words. Said differently, arbitrary structured program nodes can be embedded into the (otherwise unstructured) prose. The user can press Ctrl-Space anywhere in the prose block and insert instances of those concepts that are valid at this location. Fig. <ref type="figure">5</ref> shows an example of a requirement with a prose block that embeds a reference to another requirement. Other examples include references to arguments in function comments or embedded formulas. Margin Cells Margin cells are rendered beyond the right editor margin; each margin cell is associated with an anchor cell inside the editor, and the margin cell is rendered at the y-position of that anchor cell. Fig. <ref type="figure" target="#fig_3">6</ref> shows an example.</p><p>To use margin cells in the editor of some concept, the editor for that concept embeds a margincell cell which points to the collection that contains the margin Fig. <ref type="figure">5</ref>. The prose block includes a sequence of "normal" words plus a reference to another requirement ( §req(..)). The reference is a real, navigable and refactoring-safe pointer, not just nice syntax.</p><p>contents (the comments in Fig. <ref type="figure" target="#fig_3">6</ref>). The contents specified for the margin cell must implement the IMarginCellContent interface which contributes the facilities that connect the margin cell content to the anchor cell. Margin cells are available in the mbeddr.platform at http://mbeddr.com.  Custom Cells MPS supports embedding custom cells. This means that the user can plug in their own subclass of CellProvider and implement specific layout and paint methods. This way, any notation can be drawn in a low-level way. The cell provider can be parameterized, and ultimately, it can become a new, reusable primitive. Fig. <ref type="figure" target="#fig_5">8</ref> shows an example of a language that reports progress with work packages. It uses three custom cells: horizontal lines (parameterizable with thickness and color), check boxes (that are associated with boolean properties of the underlying language concept) and progress bars (whose percentage and color can be customized, typically by querying other parts of the model).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Other Features of the MPS Editor</head><p>As a language workbench, MPS supports the features known from traditional IDEs for custom languages. These include code completion, quick fixes, syntax coloring, code folding, goto definition, find references and refactorings. In this section we describe editor features that are specific to MPS' projectional editor. Mixed Notations The various notations discussed in the previous section can all be mixed arbitrarily (with the aforementioned exception of embedding things into graphical editors). Since all editors use the same projectional architecture this works seamlessly. In particular, non-textual notations can be used inside textual notations. Examples include:</p><p>mathematical symbols embedded in textual programs tables that contain text or math symbols tables embedded in textual programs mathematical symbols embedded in prose lines, progress bar other other shapes embedded arbitrarily Multiple Editors A single concept can define several editors, and a given program can be edited using any of them. Each of the multiple editors has a tag, and by setting tags in an editor window (either by the user or programmatically), the editors corresponding to these tags can be selected. For example, state machines can be edited in a textual version (roughly similar to Fowler's state machine DSL <ref type="bibr" target="#b7">[8]</ref>) or in the tabular notation shown in Fig. <ref type="figure">4</ref>. Partial Syntax Editors can also be partial in the sense that they do not project all contents stored in the AST. Of course the non-projected aspects of the program cannot be edited with this particular editor. But the contents remain stored in the AST (and are cut, copied, pasted or moved) and can be edited later. Using this facility, programs can be edited in ways specific to the current process   step or stakeholder. An example are the requirements traces shown in Fig. <ref type="figure" target="#fig_11">14</ref>; programs can be shown with or without them.</p><p>Query List An MPS editor normally displays nodes at their phyiscal location. For example, the child condition of the IfStatement shown in Fig. <ref type="figure" target="#fig_0">1</ref> is projected as part of its parent editor. Sometimes, however, it is useful to render nodes in other places. An example is shown in Fig. <ref type="figure" target="#fig_6">9</ref>: the grey parts are defined by the interface realized by the block, but they are still projected for the block itself.</p><p>To project nodes in locations where they are not defined, a querylist editor cell is used (available as part of the mbeddr.platform at http://mbeddr.com). Like other MPS collection cells it projects a list of nodes, but this list is assembled via an arbitrary model query. The result can be projected read-only (as in Fig. <ref type="figure" target="#fig_6">9</ref>) or fully editable. The querylist also supports callback functions for adding new nodes (because it is not automtically clear where they would have to be inserted physically) or for deleting existing ones. This way, querylists support views.</p><p>Tooltips MPS can use the projectional editing facilities in tooltips (available in the mbeddr.platform). To define a tooltip, a special cell is inserted into the editor of the cell that should display the tooltip. Since the purpose of a tooltip often is to project information gathered from other parts of the model, tooltip editors often use querylists (Fig. <ref type="figure" target="#fig_7">10</ref>).</p><p>Conditional Editors Conditional editors essentially support aspect orientation for editor cells. A conditional editor defines a decoration for existing editors as well as a pointcut that determines to which existing editor cells the decoration is applied. Figures <ref type="figure" target="#fig_10">12 and 13</ref> show examples. Importantly, these conditional editors can be defined after the fact, and potentially in a different language module. This way, arbitrary decorations can be overlaid over exiting syntax. The example in Fig. <ref type="figure" target="#fig_9">12</ref> renders an arrow above all references that have pointer type. Another example could be to change the background color of some nodes based on external data such as profiling times. By including a tooltip in the definition of the decoration, users can get more detailed information by hovering over the decorated part of the program. Another use case for conditional editors is the expression debugger shown in Fig. <ref type="figure" target="#fig_8">11</ref>. Annotations Annotations are similar to conditional editors in that they can render additional syntax around (or next to) existing syntax without the original syntax definition being aware of this. However, in contrast to conditional editors, annotations are additional nodes (i.e., they are additional data in the program) and not just a property of the projection. The additional nodes are stored as children of the annotated node. Fig. <ref type="figure" target="#fig_11">14</ref> shows an example in which requirements traces are added to C code (details are discussed in <ref type="bibr" target="#b8">[9]</ref>).</p><p>Read-Only Contents Especially in DSLs for non-programmers it is often useful to be able to project rigid, predefined, non-deletable skeletons of the to-bewritten program in order to guide the user. For example, in Fig. <ref type="figure" target="#fig_6">9</ref>, the keywords atomicblock, realizes, contract and ccode, as well as the brackets and lines, are automatically projected as soon as a user instantiates an atomic block. Similarly in Fig. <ref type="figure" target="#fig_5">8</ref>, the grey line starting with "last updated" is automatically projected and consists of computed data. In MPS, parts of the syntax of a program can be marked as readonly, meaning that they cannot be deleted or changed. This does not just work for constants (keywords), but for arbitraty content (such as the inherited ports of blocks shown in Fig. <ref type="figure" target="#fig_6">9</ref>).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Discussion and Summary</head><p>In this paper we have discussed the syntactic flexibility supported by MPS' projectional editor. We have described the various supported notational styles and emphasized that they can be combined flexibly. However, it is not enough to just compose different notations -other aspects of languages must be composed as well. Language composition with MPS is discussed in <ref type="bibr" target="#b1">[2]</ref>.</p><p>Over the last three years a team at itemis has been developing mbeddr <ref type="bibr" target="#b0">[1]</ref>, using MPS in a non-trivial development project. Many of the notations discussed   in this paper are used in mbeddr and its commercial addons. Several of the extensions have also been developed in the context of mbeddr. In addition, we are now also developing business applications (in the insurance and financial domains) with MPS. There, non-textual notations (and in particular, math and tables) are essential to be able to allow non-programmers to directly contribute to the programming effort. User feedback is very positive: they said that the abililty to have such notations is a signigicant advance over existing or alternative tools and approaches.</p><p>Based on this experience we conclude that the notations supported by MPS are reasonably complete relative to the notational styles encountered in practice. Classical textual notations are found in programming languages and DSLs; graphical notations are used by many modeling tools; mathematics are widespread in scientific or financial domains; tables are ubiquitous, as the the popularity of Excel demonstrates. And prose (with interspersed program elements) is an important ingredient to almost all these domains (for documentation, requirements or comments).</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Fig. 1 .</head><label>1</label><figDesc>Fig. 1. Editor definition for the IfStatement (details in the running text).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Fig. 2 .</head><label>2</label><figDesc>Fig. 2. Mathematical symbols used in C expressions embedded into C functions.</figDesc><graphic coords="4,134.77,115.84,159.08,51.32" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Fig. 3 .</head><label>3</label><figDesc>Fig. 3. The definition of the sum symbol editor using the LOOP primitive.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Fig. 6 .</head><label>6</label><figDesc>Fig. 6. Margin cells used to support Word-like comments in MPS; other contents can be projected into the margin as well.</figDesc><graphic coords="6,134.77,266.34,345.83,51.04" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Fig. 7 .</head><label>7</label><figDesc>Fig. 7. A graphical editor embedded in a regular text editor.</figDesc><graphic coords="7,185.11,115.84,242.08,115.28" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Fig. 8 .</head><label>8</label><figDesc>Fig. 8. Custom widgets (checkbox, line, progress bar) used in an MPS editor.</figDesc><graphic coords="7,150.52,583.21,311.24,67.89" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Fig. 9 .</head><label>9</label><figDesc>Fig.9. A querylist is used to project the ports and contracts inherited from the interface realized by this block (in grey). New nodes ports or contracts can be entered above the grey lines.</figDesc><graphic coords="8,134.77,115.84,159.08,80.98" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head>Fig. 10 .</head><label>10</label><figDesc>Fig. 10. This tooltip shows the definition of the quantity referenced via the -&gt; notation: it shows its type and various additional details. The tooltip uses the querylist to project derived nodes.</figDesc><graphic coords="8,308.48,130.72,159.08,66.10" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_8"><head>Fig. 11 .</head><label>11</label><figDesc>Fig. 11. This expression debugger renders the values of all subexpression over or to the left of the expression itself. The original expression (without the debug info) is (10 + BASEPOINTS) * (alt + speed)).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_9"><head>Fig. 12 .</head><label>12</label><figDesc>Fig. 12. C references whose type is a pointer are annotated with the arrow on top. This works for all kinds of references, including to arguments, local variables and global variables.</figDesc><graphic coords="9,134.77,552.92,159.08,52.39" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_10"><head>Fig. 13 .</head><label>13</label><figDesc>Fig. 13. The editor applies to concepts that implemenet IRef and whose type is pointer. The editor renders the arrow (manually drawn in the custom cell) on top of the existing editor.</figDesc><graphic coords="9,308.48,547.06,159.09,58.25" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_11"><head>Fig. 14 .</head><label>14</label><figDesc>Fig. 14. The first two constants have traces attached. These are pointers to requirements shown in the code. The original definition of C is not aware of these annotations.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_1"><head>toList, this.ancestor&lt;Block&gt;.allOutPorts().toList palette: custom AccentPaletteActionGroup }</head><label></label><figDesc></figDesc><table /><note>diagram { content: this.contents, this.ancestor&lt;Block&gt;.allInPorts().</note></figure>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Acknowledgements Thanks to Bernd Kolb and Niko Stotz for feedback on this paper, and to Niko Stotz for building the margin cell notation.</p></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">mbeddr: instantiating a language workbench in the embedded software domain</title>
		<author>
			<persName><forename type="first">M</forename><surname>Voelter</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Ratiu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Kolb</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Schaetz</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ASE Journal</title>
		<imprint>
			<biblScope unit="volume">20</biblScope>
			<biblScope unit="issue">3</biblScope>
			<biblScope unit="page" from="1" to="52" />
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Language and IDE Development, Modularization and Composition with MPS</title>
		<author>
			<persName><forename type="first">M</forename><surname>Voelter</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">GTTSE 2011</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Towards user-friendly projectional editors</title>
		<author>
			<persName><forename type="first">M</forename><surname>Voelter</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Siegmund</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Berger</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Kolb</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of SLE&apos;14</title>
				<meeting>SLE&apos;14</meeting>
		<imprint>
			<date type="published" when="2014">2014</date>
			<biblScope unit="page">20</biblScope>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<monogr>
		<title level="m" type="main">EMF: eclipse modeling framework</title>
		<author>
			<persName><forename type="first">D</forename><surname>Steinberg</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Budinsky</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Merks</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Paternostro</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2008">2008</date>
			<publisher>Pearson Education</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<monogr>
		<author>
			<persName><forename type="first">S</forename><surname>Lisson</surname></persName>
		</author>
		<ptr target="https://github.com/slisson/mps-math/" />
		<title level="m">MPS Math Plugin</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<monogr>
		<author>
			<persName><forename type="first">S</forename><surname>Lisson</surname></persName>
		</author>
		<ptr target="https://github.com/slisson/mps-tables/" />
		<title level="m">MPS Tables Plugin</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<monogr>
		<author>
			<persName><forename type="first">S</forename><surname>Lisson</surname></persName>
		</author>
		<ptr target="https://github.com/slisson/mps-richtext/" />
		<title level="m">MPS Richtext Plugin</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<monogr>
		<title level="m" type="main">Domain Specific Languages</title>
		<author>
			<persName><forename type="first">M</forename><surname>Fowler</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2010">2010</date>
			<publisher>Addison-Wesley Professional</publisher>
		</imprint>
	</monogr>
	<note>1st edn</note>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Requirements as first-class citizens</title>
		<author>
			<persName><forename type="first">M</forename><surname>Voelter</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Ratiu</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Tomassetti</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of ACES-MB Workshop</title>
				<meeting>ACES-MB Workshop</meeting>
		<imprint>
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
