<!DOCTYPE html>
<html>

  <head>
	<meta charset="UTF-8">
	<title>Xtext - Typical Language Configurations</title>
	
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta name="description"
		content="The website of Eclipse Xtext, an open-source framework for development of programming languages and domain-specific languages">
	<meta name="author" content="Sven Efftinge">
	<meta name="author" content="Miro Spoenemann">
	<!--  styles -->
	<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
	<!--[if lt IE 9]>
	  <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
	<![endif]-->
	
	<!-- Le fav and touch icons -->
	<link rel="shortcut icon" href="/Xtext/images/favicon.png">
	
	<link href="/Xtext/css/bootstrap.css" rel="stylesheet" type='text/css'>
	<link href="/Xtext/css/bootstrap-responsive.css" rel="stylesheet" type='text/css'>
	<link href="/Xtext/css/shield-responsive.css" rel="stylesheet" type='text/css'>
	<link href='/Xtext/css/fonts.css' rel='stylesheet' type='text/css'>
	<link href="/Xtext/css/prettyPhoto.css" rel="stylesheet" media="screen" type='text/css'>
	<link href="/Xtext/css/prettify.css" type="text/css" rel="stylesheet"/>
	<link href="/Xtext/css/style.css" rel="stylesheet" type='text/css'>
	<!-- cover flow -->
	<link href="/Xtext/css/coverflow.css" rel="stylesheet" type='text/css'>
	<!--[if lt IE 9]>
	  <link href="/css/iebugs.css" rel="stylesheet" type='text/css'>
	<![endif]-->

	<!-- BEGIN Cookie Consent
	<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.css" />
	<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.0.3/cookieconsent.min.js"></script>
	<script>
	window.addEventListener("load", function(){
	window.cookieconsent.initialise({
		"palette": {
		"popup": {
		  "background": "#000"
		},
		"button": {
		  "background": "#f1d600"
		}
		},
		"theme": "edgeless",
		"type": "opt-in",
		onInitialise: function (status) {
		  var type = this.options.type;
		  var didConsent = this.hasConsented();
		  if (type == 'opt-in' && didConsent) {
		    // TODO: enable cookies
		  }
		  if (type == 'opt-out' && !didConsent) {
		    // TODO: disable cookies
		  }
		},
		onStatusChange: function(status, chosenBefore) {
		  var type = this.options.type;
		  var didConsent = this.hasConsented();
		  if (type == 'opt-in' && didConsent) {
		    // TODO: enable cookies
		  }
		  if (type == 'opt-out' && !didConsent) {
		    // TODO: disable cookies
		  }
		}, 
		onRevokeChoice: function() {
		  var type = this.options.type;
		  if (type == 'opt-in') {
		    // TODO: disable cookies
		  }
		  if (type == 'opt-out') {
		    // TODO: enable cookies
		  }
		},
		"content": {
		"href": "http://www.eclipse.org/legal/privacy.php"
		}
	})});
	</script>
	END Cookie Consent -->
</head>


  <body>
  
    <header class="site-header">

  <!-- Navbar -->
  <div class="navbar navbar-fixed-top">
    <div class="navbar-inner">
      <div class="container">
        <a class="btn btn-navbar" data-toggle="collapse"
          data-target=".nav-collapse"> <span class="icon-bar"></span> <span
          class="icon-bar"></span> <span class="icon-bar"></span>
        </a> <a class="brand" href="/Xtext/index.html"></a>
        <div class="nav-collapse collapse" style="height: 0px;">
          <ul class="nav">
            <!--li ><a href="/Xtext/news.html">News</a></li-->
            <li ><a href="/Xtext/download.html">Download</a></li>
            <li ><a href="/Xtext/documentation/index.html">Documentation</a></li>
            <li ><a href="/Xtext/community.html">Community</a></li>
            <li class="dropdown">
              <a class="dropdown-toggle" data-toggle="dropdown" href="#">Support &amp; Trainings<span class="caret"></span></a>
              <ul class="dropdown-menu">
                <li><a href="https://www.itemis.com/en/xtext/support-and-team/" target="_blank">itemis</a></li>
                <li><a href="https://typefox.io/trainings-2" target="_blank">TypeFox</a></li>
              </ul>
            </li>
            <li ><a href="http://xtend-lang.org">Xtend</a></li>
          </ul>
          <!--div class="nav pull-right">
            <li ><a><iframe src="https://ghbtns.com/github-btn.html?user=eclipse&repo=xtext&type=star&count=true" frameborder="0" scrolling="0" width="170px" height="20px"></iframe></a></li>
          </div-->
        </div>
        <!--/.nav-collapse -->
      </div>
    </div>
  </div>
  <!-- Navbar End -->

</header>


    <div class="page-content">
  <script>
    function startSearch(event) {
        if (event.keyCode == 13) {
            var q = 'site:eclipse.org/Xtext/documentation+' + event.target.value;
            window.open('https://www.google.com/search?q=' + q, "_self");
        }
    }
  </script>
  <div class="wrapper">
  	<div id="page">  
      <div class="inner">
        <div id="maincontainer" class="container">
          <span class="edit-on-github pull-right">
            <a href="https://github.com/eclipse/xtext/edit/website-published/xtext-website/documentation/307_special_languages.md">Edit on Github</a>
          </span>
          <div class="span3" style="margin-left: 0px;">
            <div class="search-bar">
              <img src="/Xtext/images/search-gray.png"/>
              <input type="search" id="google-search" onkeyup="startSearch(event);"/>
            </div>
            <ul id="nav-outline" style="margin-left: 0px;">
	<li class="nav-part">Getting Started</li>
	<li><a href="102_domainmodelwalkthrough.html">15 Minutes Tutorial</a></li>
	<li><a href="103_domainmodelnextsteps.html">15 Minutes Tutorial - Extended</a></li>
	<li><a href="104_jvmdomainmodel.html">Five simple steps to your JVM language</a></li>
		
	<li class="nav-part">Reference Documentation</li>
	<li><a href="301_grammarlanguage.html">The Grammar Language</a></li>
	<li><a href="302_configuration.html">Configuration</a></li>
	<li><a href="303_runtime_concepts.html">Language Implementation</a></li>
	<li><a href="305_xbase.html">Integration with Java</a></li>
	<li><a href="307_special_languages.html">Typical Language Configurations</a></li>
	<li><a href="308_emf_integration.html">Integration with EMF</a></li>
	<li><a href="310_eclipse_support.html">Eclipse Support</a></li>
	<li><a href="330_web_support.html">Web Editor Support</a></li>
	<li><a href="350_continuous_integration.html">Continuous Integration</a></li>
</ul>
          </div>
          <div class="span8 doc-contents">
            <h1 id="special-languages">Typical Language Configurations</h1>

<h2 id="case-insensitive-languages">Case Insensitive Languages</h2>

<p>In some cases, e.g. if your <em>SHIFT</em> key is broken, you might want to design a case insensitive language. Xtext offers options on some of its <a href="302_configuration.html#generator-fragment">generator fragments</a> for this purpose.</p>

<p>For case insensitive keywords, open your MWE workflow and enable the ignoreCase property:</p>

<pre><code class="language-mwe2"> ... StandardLanguage {
    ... other config

    parserGenerator = {
      options = {
        ignoreCase = true
      }
    }
 }
</code></pre>

<p>For case insensitive element names, use the <em>ignoreCase</em> option in the scoping, too :</p>

<pre><code class="language-mwe2">    scopeProvider = {
      ignoreCase = true
    }
</code></pre>

<h2 id="whitespace-aware-languages">Whitespace-Aware Languages</h2>

<p>Some language designers prefer to use indentation to structure code blocks instead of surrounding them with braces <code>{ ... }</code>, which are really hard to type with certain kinds of keyboards. A well-known example of such a language is <a href="https://www.python.org">Python</a>. Another well-known example is the <em>Home Automation</em> language shipped with Xtext, available through <em>File → New → Example → Xtext Examples → Xtext Home Automation Example</em>.</p>

<pre><code class="language-ruleengine">Device Window can be open, closed

Device Heater can be on, off, error

Rule 'Save energy' when Window.open then
    fire(Heater.off)
    println('Another penny to the piggy bank!')
</code></pre>

<p>The <code>'Save energy'</code> rule contains a code block with two operations, which is indicated by the equal indentation of these operations. Nested blocks are also possible:</p>

<pre><code class="language-ruleengine">Rule 'Report error' when Heater.error then
    var String report
    do
        Thread.sleep(500)
        report = HeaterDiagnostic.readError
    while (report == null)
    println(report)
</code></pre>

<p>The first step for including whitespace-aware blocks in your language is to use  <em>synthetic tokens</em> in the grammar by writing terminals of the form <code>'synthetic:&lt;terminal name&gt;'</code>:</p>

<pre><code class="language-xtext">terminal BEGIN: 'synthetic:BEGIN';
terminal END: 'synthetic:END';
</code></pre>

<p>These terminals can be used to mark the boundaries of code blocks. The Xtext Home Automation example inherits expressions from <a href="305_xbase.html">Xbase</a> and redefines the syntax of block expressions:</p>

<pre><code class="language-xtext">@Override
XBlockExpression returns xbase::XExpression:
    {xbase::XBlockExpression}
    BEGIN
        (expressions+=XExpressionOrVarDeclaration ';'?)*
    END;
</code></pre>

<p>After running the workflow, a stub implementation of <code>AbstractIndentationTokenSource</code> is generated in the <code>parser.antlr</code> subpackage, e.g. <a href="https://github.com/eclipse/xtext-eclipse/blob/master/org.eclipse.xtext.xtext.ui.examples/projects/homeautomation/org.eclipse.xtext.example.homeautomation/src/org/eclipse/xtext/example/homeautomation/parser/antlr/RuleEngineTokenSource.java">RuleEngineTokenSource</a>. Here you can specify which terminal rule should be applied to your synthetic tokens. For the Xtext Home Automation language the <code>WS</code> (whitespace) rule is selected, which brings the indentation awareness as seen above.</p>

<p>In case of a whitespace-aware language, the <a href="303_runtime_concepts.html#formatting">formatter</a> must be either adapted to produce whitespace that correctly reflects the document structure, or it must be deactivated. Otherwise automatic formatting might produce code with different semantics or even syntax errors. See how we <a href="https://github.com/eclipse/xtext-eclipse/blob/master/org.eclipse.xtext.xtext.ui.examples/projects/homeautomation/org.eclipse.xtext.example.homeautomation/src/org/eclipse/xtext/example/homeautomation/formatting2/RuleEngineFormatter.xtend">customized the formatter</a> in the Xtext Home Automation example.</p>

<h2 id="java-independent-languages">Languages Independent of JDT</h2>

<p>The following section describes how you make your language independent of Eclipse’s Java Development Toolkit (JDT).</p>

<p>In the <em>UIModule</em> of your language you have to overwrite two bindings. First, remove the bindings to components with support for the <em>‘classpath:’</em> URI protocol, i.e.</p>

<pre><code class="language-java">@Override
public Class&lt;? extends IResourceForEditorInputFactory&gt;
    bindIResourceForEditorInputFactory() {
        return ResourceForIEditorInputFactory.class;
}

@Override
public Class&lt;? extends IResourceSetProvider&gt; bindIResourceSetProvider() {
    return SimpleResourceSetProvider.class;
}
</code></pre>

<p>Second, configure the global scope provider to scan project root folders instead of the class path of Java projects.</p>

<pre><code class="language-java">@Override
public Provider&lt;IAllContainersState&gt; provideIAllContainersState() {
  return org.eclipse.xtext.ui.shared.Access.getWorkspaceProjectsState();
}
</code></pre>

<p>The remaining steps show you how to adapt the project wizard for your language, if you have generated one. The best way to do this is to create a new subclass of the generated <em>IProjectCreator</em> in the <em>src/</em> folder of the <em>ui</em> project and apply the necessary changes there. First, remove the JDT project configuration by overriding <em>configureProject</em> with an empty body.</p>

<p>The next thing is to redefine the project natures and builders that should be applied to your language projects.</p>

<p>In in this case just remove the JDT stuff in this way:</p>

<pre><code class="language-java">protected String[] getProjectNatures() {
    return new String[] {
        "org.eclipse.pde.PluginNature",
        "org.eclipse.xtext.ui.shared.xtextNature"
    };
}

protected String[] getBuilders() {
    return new String[] {
        "org.eclipse.pde.ManifestBuilder", 
        "org.eclipse.pde.SchemaBuilder"
    };
}
</code></pre>

<p>After that you have to bind the new <em>IProjectCreator</em></p>

<pre><code class="language-java">@Override
public Class&lt;? extends IProjectCreator&gt; bindIProjectCreator() {
    return JDTFreeMyDslProjectCreator.class;
}
</code></pre>

<p>Now your language and its IDE should now no longer depend on JDT.</p>

<h2 id="expressions">Parsing Expressions with Xtext</h2>

<p>Parsing simple XML-like, structural languages with Xtext is a no-brainer. However, parsing nested expressions is often considered complicated. This is the perception due to their recursive nature and the properties of the parser technology used by Xtext. You have to avoid left recursive parser rules. As the underlying Antlr parser uses a top-down approach it would recurse endlessly if you had a left recursive grammar.</p>

<p>Let’s have a look at parsing a simple arithmetic expression:</p>

<p><code>2 + 20 * 2</code></p>

<p>If you know EBNF a bit and wouldn’t think about avoiding left recursion, operator precedence or associativity, you’ld probably write a grammar like this:</p>

<pre><code class="language-xtext">Expression :
  Expression '+' Expression |
  Expression '*' Expression |
  INT;
</code></pre>

<p>This grammar would be left recursive because the parser reads the grammar top down and left to right and would endlessly call the <em>Expression</em> rule without consuming any characters, i.e. altering the underlying state of the parser. While this kind of grammar can be written for bottom-up parsers, you would still have to deal with operator precedence in addition. That is define that a multiplication has higher precedence than an addition for example.</p>

<p>In Xtext you define the precedence implicitly when left-factoring such a grammar. Left-factoring means you get rid of left recursion by applying a certain idiom, which is described in the following.</p>

<p>Here is a left-factored grammar (not yet working with Xtext) for the expression language above:</p>

<pre><code class="language-xtext">Addition :
  Multiplication ('+' Multiplication)*;

Multiplication:
  NumberLiteral ('*' NumberLiteral)*;

NumberLiteral:
  INT;
</code></pre>

<p>As you can see the main difference is that it uses three rules instead of one, and if you look a bit closer you see that there’s a certain delegation pattern involved. The rule <em>Addition</em> doesn’t call itself but calls <em>Multiplication</em> instead. The operator precedence is defined by the order of delegation. The later the rule is called the higher is its precedence. This is at least the case for the first two rules which are of a left recursive nature (but we’ve left-factored them now). The last rule is not left recursive which is why you can implement it without applying this pattern.</p>

<p>The next task is to allow users to explicitly adjust precedence by adding parentheses, e.g. write something like <code>(2 + 20) * 2</code>. So let’s add support for that (note that the grammar is still not yet working with Xtext):</p>

<pre><code class="language-xtext">Addition :
  Multiplication ('+' Multiplication)*;

Multiplication:
  Primary ('*' Primary)*;

Primary :
  NumberLiteral |
  '(' Addition ')';

NumberLiteral:
  INT;
</code></pre>

<p>Once again: if you have some construct that recurses on the left hand side, you need to put it into the delegation chain according to the operator precedence. The pattern is always the same: the thing that recurses delegates to the rule with the next higher precedence.</p>

<h3 id="construction-of-an-ast">Construction of an AST</h3>

<p>Now that left recursion is avoided, the parser should produce a proper syntax tree. In Xtext each rule returns a value. Production rules return AST nodes (i.e. instances of EObject), enum rules return enum literals and data type rules as well as terminal rules return simple values like strings. Xtext can automatically infer whether some rule is a production rule, i.e. constructs and returns an AST node, or if it is a data type rule that returns a value. The grammar above only consists of data type rules all of them returning plain strings. In order to construct an AST we need to add assignments and actions to the grammar.</p>

<p>The return type of a rule can be specified explicitly using the <code>returns</code> keyword but can be inferred if the type’s name is the same as the rule’s name. That is</p>

<pre><code class="language-xtext">NumberLiteral : ... ;
</code></pre>

<p>is a short form of</p>

<pre><code class="language-xtext">NumberLiteral returns NumberLiteral : ... ;
</code></pre>

<p>However in the case of the expression grammar above, all rules need to return the same type since they are recursive. In order to make the grammar valid, a common return type has to be added explicitly (but the grammar is still missing some bits):</p>

<pre><code class="language-xtext">Addition returns Expression:
  Multiplication ('+' Multiplication)*;
  
Multiplication returns Expression:
  Primary ('*' Primary)*;
  
Primary returns Expression:
  NumberLiteral |
  '(' Addition ')';
  
NumberLiteral:
  INT;
</code></pre>

<p>The AST type inference mechanism of Xtext will infer two types: <em>Expression</em> and <em>NumberLiteral</em>. Assignments and actions have to be added to store all the important information in the AST and to create reasonable subtypes for the additive and multiplicative expressions. The fully working Xtext grammar is:</p>

<pre><code class="language-xtext">Addition returns Expression:
  Multiplication ({Addition.left=current} '+' right=Multiplication)*;
  
Multiplication returns Expression:
  Primary ({Multiplication.left=current} '*' right=Primary)*;
  
Primary returns Expression:
  NumberLiteral |
  '(' Addition ')';
  
NumberLiteral:
  value=INT;
</code></pre>

<p>This is how the parser processes the following expression:</p>

<pre><code class="language-java">(1 + 20) * 2
</code></pre>

<p>It always starts with the first rule <em>Addition</em>. Therein the first element is an unassigned rule call to <em>Multiplication</em> which in turn calls <em>Primary</em>. <em>Primary</em> now has two alternatives. The first one is calling <em>NumberLiteral</em> which consists only of one assignment to a feature called ‘value’. The type of ‘value’ has to be compatible to the return type of the <em>INT</em> rule.</p>

<p>But as the first token in the sample expression is an opening parenthesis ‘(‘, the parser will take the second alternative in <em>Primary</em>: it consumes the ‘(‘ and calls the rule <em>Addition</em>. Now the value ‘1’ is the lookahead token and again <em>Addition</em> calls <em>Multiplication</em> and <em>Multiplication</em> calls <em>Primary</em>. This time the parser takes the first alternative because ‘1’ was consumed by the <em>INT</em> rule.</p>

<p>As soon as the parser hits an assignment it checks whether an AST node for the current rule was already created. Otherwise it will create one based on the return type of the current rule, which is <em>NumberLiteral</em>. The Xtext generator created the EClass ‘NumberLiteral’ before which can now be instantiated. That type will also have a property called value of type int, which will get the value ‘1’ set. This is what the Java equivalent looks like:</p>

<pre><code class="language-java">// value=INT
if (current == null)
 current = new NumberLiteral();
current.setValue(ruleINT());
...
</code></pre>

<p>Now that the rule has been completed the produced EObject is returned to the calling rule <em>Primary</em>, which in turn returns the object unchanged to its own caller. Within <em>Multiplication</em> the rule <em>Primary</em> has been successfully parsed and returned an instance of <em>NumberLiteral</em>. The remainder of the rule (everything within the parentheses) is a so called group. The asterisk behind the closing parenthesis states that this part can be consumed zero or more times. The first token to consume in this group is the multiplication operator ‘*’. Unfortunately in the current input the next token to accept is the plus sign ‘+’, so the group is not consumed at all and the rule returns the <em>NumberLiteral</em> that was returned from the previous unassigned rule call.</p>

<p>In rule <em>Addition</em> there is a similar group but this time it expects the correct operator. The parser steps into the group. The first element in the group is an assigned action. It will create a new instance of type <em>Addition</em> and assigns what was the to-be-returned object to the feature ‘left’. In Java this would have been something like:</p>

<pre><code class="language-java">// Multiplication rule call
current = ruleMultiplication();
// {Addition.left=current}
Addition temp = new Addition();
temp.setLeft(current);
current = temp;
...
</code></pre>

<p>As a result the rule would now return an instance of <em>Addition</em> which has a <em>NumberLiteral</em> set to its property left. Next up the parser consumes the ‘+’ operator. The operator itself is not stored in the AST because there is an explicit Addition type. It implicitly contains this information. The assignment <code>right=Multiplication</code> calls the rule <em>Multiplication</em> another time and assigns its result object (a NumberLiteral of value=20) to the property <code>right</code>. The closing parenthesis is matched afterwards, consumed and the parser stack is reduced once more.</p>

<p>The parser is now in the rule <em>Multiplication</em> and has the multiplication operator ‘*’ on the lookahead. It steps into the group and applies the action. Finally it calls the <em>Primary</em> rule, produces another instance of <em>NumberLiteral</em> (value=2), assigns it as the ‘right’ operand of the <em>Multiplication</em> and returns the <em>Multiplication</em> to the rule <em>Addition</em> which in turn returns the very same object as there’s nothing left to parse.</p>

<p>The resulting AST looks like this:</p>

<p><img src="images/expression-ast.png" alt="" /></p>

<h3 id="associativity">Associativity</h3>

<p>There is still one topic worth to mention, which is associativity. There is left and right associativity as well as non-associativity. The example above implements left associativity. Associativity tells the parser how to construct the AST when there are two infix operations with the same precedence. The following example is taken from the corresponding wikipedia entry:</p>

<p>Consider the expression a ~ b ~ c. If the operator ~ has left associativity, this expression would be interpreted as (a ~ b) ~ c and evaluated left-to-right. If the operator has right associativity, the expression would be interpreted as a ~ (b ~ c) and evaluated right-to-left. If the operator is non-associative, the expression might be a syntax error, or it might have some special meaning. The most common variant is left associativity:</p>

<pre><code class="language-xtext">Addition returns Expression:
  Multiplication ({Addition.left=current} '+' right=Multiplication)*;
</code></pre>

<p>Right associativity is done using a slightly modified pattern. Note the quantity operator and the call to the rule itself in the group:</p>

<pre><code class="language-xtext">Addition returns Expression:
  Multiplication ({Addition.left=current} '+' right=Addition)?;
</code></pre>

<p>Non-associativity can be implemented in a similar way, but this time the final rule call is not immediately recursive but delegates to the next precedence level:</p>

<pre><code class="language-xtext">Addition returns Expression:
  Multiplication ({Addition.left=current} '+' right=Multiplication)?;
</code></pre>

<p>Sometimes it’s more convenient to allow associativity on parser level, but forbid it later using validation. This allows more descriptive diagnostics. Also the whole parsing process won’t rely on error recovery but the editor will generally be more forgiving.</p>

<hr />

<p><strong><a href="308_emf_integration.html">Next Chapter: Integration with EMF and Other EMF Editors</a></strong></p>

          </div>
        </div>
      </div>
    </div>
  </div>
</div>
    
    <footer class="site-footer">
  <div id="extra">
    <div class="inner">
      <div class="container">
        <div class="row">
          <div class="span6">
            <h3 class="footer-links-header">Quick Links</h3>
            <ul class="footer-links clearfix">
              <li><a href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
              <li><a href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
              <li><a href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
              <li><a href="http://www.eclipse.org/legal/">Legal</a></li>
            </ul>
            <ul class="footer-links clearfix">
              <li><a href="http://www.eclipse.org">Eclipse Home</a></li>
              <li><a href="http://marketplace.eclipse.org/">Market Place</a></li>
              <li><a href="http://www.planeteclipse.org/">Eclipse Planet</a></li>
              <li><a href="https://www.eclipse.org/forums/index.php/f/27/">Xtext Forum</a></li>
            </ul>
          </div>
          <div class="span6">
            <!-- Social Media Links -->
            <h3 class="footer-links-header"">Social Media</h3>
            <ul class="footer-links clearfix">
              <li>
                <a href="https://twitter.com/xtext"><img src="/Xtext/images/Twitter-bird-darkgray.png" class="img-responsive" style="margin-right: 5px;height: 1em;" alt="Twitter icon">@xtext on Twitter</a>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </div>
  </div>
  <a href="#" class="scrollup fadeOutRight animated" style="display: none;">ScrollUp</a>
  <!-- Le javascript
      ================================================== -->
  <!-- Placed at the end of the document so the pages load faster -->
  
  <script src="/Xtext/js/jquery-1.11.3.min.js"></script>
  <script src="/Xtext/js/bootstrap.min.js"></script>
  <script src="/Xtext/js/jquery.easing.1.3.js" type="text/javascript"></script>
  <script src="/Xtext/js/jquery.prettyPhoto.js" type="text/javascript"></script>
  <script src="/Xtext/js/prettify.js" type="text/javascript"></script>
  <script src="/Xtext/js/lang-xtend.js" type="text/javascript"></script>
  <script src="/Xtext/js/lang-common.js" type="text/javascript"></script>
  <script src="/Xtext/js/custom.js" type="text/javascript"></script>
  <!--script src="https://apis.google.com/js/platform.js" async defer></script-->
  <!--script type="text/javascript">
    var _gaq = _gaq || [];  
      _gaq.push([ '_setAccount', 'UA-2429174-3' ]);
    _gaq.push([ '_trackPageview' ]);
    (function() {
      var ga = document.createElement('script');
      ga.type = 'text/javascript';
      ga.async = true;
      ga.src = ('https:' == document.location.protocol ? 'https://ssl'
          : 'http://www')
          + '.google-analytics.com/ga.js';
      var s = document.getElementsByTagName('script')[0];
      s.parentNode.insertBefore(ga, s);
    })();
  </script-->
  <script src="/Xtext/js/coverflow.min.js" type="text/javascript"></script>
  <script>
      $(function() {
        $('#coverflow').coverflow({
          active : 1,
          visibleAside: 2,
          overlap : 0.5,
          scale : 0.9,
          angle : 20,
          trigger : {
            "itemfocus" : true,
            "swipe" : true,
            "mousewheel" : false
          }
        });
        $('#coverflow :hidden').toggle();
        $(window).resize(function() {
          $('#coverflow').coverflow();
        });
      });

  </script>
</footer>


  </body>

</html>
